পাইপ্লট স্ক্যাটার প্লট মার্কার আকার


376

স্ক্যাটার প্লটের জন্য পাইপলট ডকুমেন্টে:

matplotlib.pyplot.scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,
                          vmin=None, vmax=None, alpha=None, linewidths=None,
                          faceted=True, verts=None, hold=None, **kwargs)

চিহ্নিতকারী আকার

গুলি: পয়েন্টগুলিতে আকার ^ 2। এটি একটি স্কেলার বা x এবং y এর সমান দৈর্ঘ্যের অ্যারে।

ইউনিট কি ধরনের points^2? এর মানে কী? না s=100মানে 10 pixel x 10 pixel?

মূলত আমি বিভিন্ন চিহ্নিতকারী মাপের সাথে স্ক্যাটার প্লট করার চেষ্টা করছি এবং আমি সংখ্যাটি কী বোঝায় তা নির্ধারণ করতে চাই s


ফন্টের জন্য একই পয়েন্টগুলি একই ইউনিট হিসাবে ব্যবহৃত হয় তা নিশ্চিত।
টাকসওয়েল

@ ট্যাকসওয়েল, আপনার মানে s=20চিহ্নিতকারীটির আকার একটি fontsize=20অক্ষরের সমান ?
এলডব্লিউজেড

না, ক্ষেত্রফলটি 20 পয়েন্ট ^ 2 হবে, একটি fontsize=20চিঠি 20 pts লম্বা (বা ফন্টের রেফারেন্সের অক্ষরটি 20 pts দীর্ঘ))
টাকাসওয়েল

23
matplotlib.pyplot.plot()হয়েছে msপ্যারামিটার ( markersize) এর জন্য একটি সমতুল্য matplotlib.pyplot.scatter()প্যারামিটার s( size)। কেবল একটি অনুস্মারক ..
নিকাসাস

@ নিউকাস আমার কাছে মনে হয় তারা নেই, যেহেতু একটি পিক্সেল (মার্কারসাইজ) এবং অন্যটি এই অদ্ভুত স্কোয়ার্ড পয়েন্ট ইউনিটে (আকার) রয়েছে। এটি আমার কাছে সর্বদা বিভ্রান্তিকর ছিল, তবে আমি বিশ্বাস করি যে এটি স্ক্রেটারপ্লোটের আকারের সাথে দৃশ্যমান আনুপাতিক উপায়ে পরিমাণ বোঝাতে ব্যবহৃত হচ্ছে with
হেলটনবাইকার

উত্তর:


406

আকারটি সংজ্ঞায়নের জন্য এটি কিছুটা বিভ্রান্তিকর উপায় হতে পারে তবে আপনি মূলত চিহ্নিতকারীটির ক্ষেত্রটি নির্দিষ্ট করে দিচ্ছেন । এর অর্থ, চিহ্নিতকারীর প্রস্থ (বা উচ্চতা) দ্বিগুণ করার জন্য আপনাকে s৪ এর গুণক বৃদ্ধি করতে হবে [[কারণ এ = ডাব্লু এইচ => (২ ডাব্লু ) (২ এইচ) = ৪ এ]

তবে একটি কারণ রয়েছে যে চিহ্নিতকারীগুলির আকারটি এইভাবে সংজ্ঞায়িত করা হয়। প্রস্থের বর্গক্ষেত্র হিসাবে ক্ষেত্রের স্কেলিংয়ের কারণে, প্রস্থের দ্বিগুণ হওয়া প্রকৃতপক্ষে একটি ফ্যাক্টর 2 এর চেয়ে বেশি আকার বাড়িয়ে উপস্থিত হয় (বাস্তবে এটি 4 এর গুণক দ্বারা বৃদ্ধি করে)। এটি দেখতে নিম্নলিখিত দুটি উদাহরণ এবং তারা উত্পাদিত আউটপুট বিবেচনা করুন।

# doubling the width of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*4**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

দেয়

এখানে চিত্র বর্ণনা লিখুন

আকারটি কীভাবে খুব দ্রুত বৃদ্ধি পায় তা লক্ষ্য করুন। পরিবর্তে আমরা যদি

# doubling the area of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

দেয়

এখানে চিত্র বর্ণনা লিখুন

এখন স্বজ্ঞাগত ফ্যাশনে চিহ্নিতকারীগুলির আপাত আকারটি প্রায় রৈখিকভাবে বৃদ্ধি পায়।

একটি 'পয়েন্ট' কী এর সঠিক অর্থ হিসাবে এটি চক্রান্তের উদ্দেশ্যে মোটামুটি স্বেচ্ছাচারী, আপনি যতগুলি যুক্তিসঙ্গত না দেখেন ততক্ষণ আপনি ধ্রুবক দ্বারা সমস্ত আকার মাপতে পারেন।

আশাকরি এটা সাহায্য করবে!

সম্পাদনা: (@ এমা থেকে মন্তব্যের জবাবে)

এটি সম্ভবত আমার পক্ষে বিভ্রান্তিকর শব্দ ing একটি বৃত্তের প্রস্থ দ্বিগুণ করার বিষয়ে প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তাই প্রতিটি বৃত্তের জন্য প্রথম ছবিতে (যেমন আমরা বাম থেকে ডানে সরে যাই) এর প্রস্থটি আগের চেয়ে দ্বিগুণ হয় তাই ক্ষেত্রের জন্য এটি বেসের সাথে ঘনিষ্ঠ is. একইভাবে দ্বিতীয় উদাহরণ প্রতিটি বৃত্ত আছে সর্বশেষের দ্বিগুণ ক্ষেত্রফল থাকে যা বেস 2 সহ সূচক দেয়।

তবে এটি দ্বিতীয় উদাহরণ (যেখানে আমরা অঞ্চলটি স্কেলিং করছি) দ্বিগুণ করার ক্ষেত্রটি বৃত্তটিকে চোখের চেয়ে দ্বিগুণ করে তোলে। সুতরাং আমরা যদি একটি বৃত্ত nবৃহত্তর একটি ফ্যাক্টর প্রদর্শিত হতে চান আমরা nব্যাসার্ধ না দিয়ে একটি ফ্যাক্টর দ্বারা অঞ্চল বৃদ্ধি করব যাতে আপাত আকারটি ক্ষেত্রের সাথে রৈখিকভাবে স্কেল করে।

সম্পাদন করা@ টমাসজেন্ডার দ্বারা মন্তব্যটি কল্পনা করতে :

এটি চিহ্নিতকারী আকারের বিভিন্ন ফাংশনের জন্য দেখতে দেখতে এটি:

এক্সফেনশনাল, স্কোয়ার বা লিনিয়ার আকার

x = [0,2,4,6,8,10,12,14,16,18]
s_exp = [20*2**n for n in range(len(x))]
s_square = [20*n**2 for n in range(len(x))]
s_linear = [20*n for n in range(len(x))]
plt.scatter(x,[1]*len(x),s=s_exp, label='$s=2^n$', lw=1)
plt.scatter(x,[0]*len(x),s=s_square, label='$s=n^2$')
plt.scatter(x,[-1]*len(x),s=s_linear, label='$s=n$')
plt.ylim(-1.5,1.5)
plt.legend(loc='center left', bbox_to_anchor=(1.1, 0.5), labelspacing=3)
plt.show()

2
আমি সম্ভবত আপনার বিষয়টিকে ভুল বোঝাবুঝি করছি, তবে আপনার দ্বিতীয় উদাহরণে আপনি দ্রুত (s = [20, 40, 80, 160, 320, 640]) বৃদ্ধি পাচ্ছেন এবং বলছেন যে এটি আমাদের সুন্দর রৈখিক আকারের বৃদ্ধি দেয়। আকারটি রৈখিকভাবে বৃদ্ধি করা (উদাহরণস্বরূপ s = [20, 40, 60, 80, 100, 120]) লিনিয়ার চেহারার ফলাফল দিলে কী তা বোঝা যায় না?
এমা 20

@ এমা আপনার অন্তর্নিহিতটি সঠিক, এটি আমার পক্ষে কম শব্দ করা (এক্স অক্ষ স্কেলিংয়ের বিকল্প বিকল্প)। আমি একটি সম্পাদনায় আরও কিছু ব্যাখ্যা করেছি কারণ এটি কোনও মন্তব্যের জন্য দীর্ঘ long
ড্যান

1
sফিগার উইন্ডোর আকার অনুযায়ী মান পরিবর্তন করা কি সম্ভব ? মানে আমরা যদি চিত্রের উইন্ডো সর্বাধিক করি তবে আমার বড় আকারের চিহ্ন থাকতে হবে।
সিগুর

2
দুর্দান্ত উদাহরণ (কেবল প্রয়োজনীয় জিনিস!)। এই হওয়া উচিত নয় 4 ** nএবং 2 ** n, কিন্তু n ** 4এবং n ** 2। সঙ্গে 2 ** nদ্বিতীয় চক্রান্ত বৃত্ত ব্যাস পরিপ্রেক্ষিতে সুসংগত স্কেল নেই। এটি এখনও খুব দ্রুত চলে যায় (উপরের দিকে তেমনটা নয়)।
টমাসজ গ্যান্ডোর

1
এটিকে আরও সংক্ষিপ্ত করে রাখলে - দ্বিতীয় প্লটটি তাত্পর্যপূর্ণটির বর্গমূল দেখায় - যা অন্য একটি সূচকীয়, কিছুটা কম খাড়া।
টমাসজ গ্যান্ডোর

217

যেহেতু এখানে অন্যান্য উত্তরগুলি দাবি করে যে sচিহ্নিতকারীটির ক্ষেত্রকে চিহ্নিত করে, আমি এই উত্তরটি যুক্ত করছি এটি পরিষ্কার করার জন্য যে এটি প্রয়োজনীয় তা নয়।

পয়েন্টগুলিতে আকার ^ 2

যুক্তি sমধ্যে plt.scatter-এর মানে markersize**2। যেমন ডকুমেন্টেশন বলে

s: স্কেলার বা অ্যারে_লাইক, আকৃতি (এন,),
পয়েন্ট in 2 এ size চ্ছিক আকার। ডিফল্ট হ'ল rcParams ['lines.markersize '] ** 2।

এটি আক্ষরিকভাবে নেওয়া যেতে পারে। এক্স পয়েন্ট বড় আকারের একটি মার্কার পাওয়ার জন্য আপনাকে সেই সংখ্যাটি বর্গাকার করতে হবে এবং sযুক্তিটি দিতে হবে ।

সুতরাং একটি লাইন প্লটের চিহ্নিতকারী আকার এবং স্ক্যাটার আকারের যুক্তির মধ্যে সম্পর্কটি বর্গক্ষেত্র। 10 পয়েন্টের আকারের প্লট মার্কার হিসাবে একই আকারের একটি স্ক্যাটার মার্কার তৈরি করতে আপনি কল করতে পারেন scatter( .., s=100)

এখানে চিত্র বর্ণনা লিখুন

import matplotlib.pyplot as plt

fig,ax = plt.subplots()

ax.plot([0],[0], marker="o",  markersize=10)
ax.plot([0.07,0.93],[0,0],    linewidth=10)
ax.scatter([1],[0],           s=100)

ax.plot([0],[1], marker="o",  markersize=22)
ax.plot([0.14,0.86],[1,1],    linewidth=22)
ax.scatter([1],[1],           s=22**2)

plt.show()

"অঞ্চল" এর সাথে সংযোগ

সুতরাং sপ্যারামিটারের ক্ষেত্রে অন্যান্য উত্তরগুলি এমনকি ডকুমেন্টেশন কেন "অঞ্চল" সম্পর্কে কথা বলে ?

অবশ্যই পয়েন্টের ইউনিটগুলি ** 2 এরিয়া ইউনিট।

  • বর্গাকার চিহ্নিতকরণের বিশেষ ক্ষেত্রে, চিহ্নিতকারীর marker="s"ক্ষেত্রটি হ'ল সরাসরি এর মানs প্যারামিটারের ।
  • একটি বৃত্তের জন্য, বৃত্তের ক্ষেত্রফল area = pi/4*s
  • অন্যান্য চিহ্নিতকারীদের জন্য এমনকি চিহ্নিতকারীটির ক্ষেত্রের সাথে কোনও সুস্পষ্ট সম্পর্ক নাও থাকতে পারে।

এখানে চিত্র বর্ণনা লিখুন

সব ক্ষেত্রে তবে চিহ্নিতকারীর ক্ষেত্রটি sপ্যারামিটারের সাথে সমানুপাতিক । এটি বেশিরভাগ ক্ষেত্রে এটি সত্যই না হলেও এটি "অঞ্চল" বলার অনুপ্রেরণা।

কিছু পরিমাণের আকারে স্ক্যাটার চিহ্নিতকারীগুলির আকার নির্দিষ্ট করে যা চিহ্নিতকারীর ক্ষেত্রের সাথে আনুপাতিক হয় তাই এটি বোঝা যায় কারণ এটি চিহ্নিতকারীর ক্ষেত্র যা তার পাশের দৈর্ঘ্য বা ব্যাসের চেয়ে বিভিন্ন প্যাচগুলির তুলনা করার সময় উপলব্ধি করা হয়। অর্থাত্ অন্তর্নিহিত পরিমাণ দ্বিগুণ করার ক্ষেত্রে চিহ্নিতকারীটির ক্ষেত্র দ্বিগুণ করা উচিত।

এখানে চিত্র বর্ণনা লিখুন

পয়েন্ট কি?

এখনও অবধি স্ক্যাটার চিহ্নিতকারীটির আকার কী বোঝায় তার উত্তর পয়েন্টগুলির এককগুলিতে দেওয়া হয়। পয়েন্টগুলি প্রায়শই টাইপোগ্রাফিতে ব্যবহৃত হয়, যেখানে ফন্টগুলি পয়েন্টগুলিতে নির্দিষ্ট করা হয়। এছাড়াও লাইনউইথগুলি প্রায়শই পয়েন্টগুলিতে নির্দিষ্ট করা হয়। ম্যাটপ্ল্লোলিবের পয়েন্টগুলির স্ট্যান্ডার্ড আকারটি প্রতি ইঞ্চি 72 পয়েন্ট (পিপিআই) - 1 পয়েন্ট তাই 1/72 ইঞ্চি।

পয়েন্টগুলির পরিবর্তে পিক্সেলগুলিতে আকারগুলি নির্দিষ্ট করতে সক্ষম হতে দরকারী be চিত্র dpi পাশাপাশি 72, এক পয়েন্ট এক পিক্সেল। যদি চিত্র dpi আলাদা হয় (ম্যাটপ্লোটিলিব ডিফল্ট হয় fig.dpi=100),

1 point == fig.dpi/72. pixels

পয়েন্টগুলিতে বিচ্ছুরণকারী চিহ্নিতকারীর আকারটি বিভিন্ন চিত্র dpi এর জন্য পৃথক দেখায়, কেউ 10 থেকে 10 পিক্সেল ^ 2 মার্কার তৈরি করতে পারে, যা সর্বদা একই পিক্সেলের আওতায় থাকবে:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

import matplotlib.pyplot as plt

for dpi in [72,100,144]:

    fig,ax = plt.subplots(figsize=(1.5,2), dpi=dpi)
    ax.set_title("fig.dpi={}".format(dpi))

    ax.set_ylim(-3,3)
    ax.set_xlim(-2,2)

    ax.scatter([0],[1], s=10**2, 
               marker="s", linewidth=0, label="100 points^2")
    ax.scatter([1],[1], s=(10*72./fig.dpi)**2, 
               marker="s", linewidth=0, label="100 pixels^2")

    ax.legend(loc=8,framealpha=1, fontsize=8)

    fig.savefig("fig{}.png".format(dpi), bbox_inches="tight")

plt.show() 

আপনি যদি ডেটা ইউনিটগুলিতে কোনও ছড়িয়ে ছিটিয়ে আগ্রহী হন তবে এই উত্তরটি দেখুন


ভাবছেন যে কীভাবে স্ক্রটারকে ব্যাস কভার করে এমন একটি বৃত্ত পেতে কী কী প্যারামিটার দিতে হবে তা গণনা করা যাক, যাক, প্লটের আসল স্থানাঙ্কীতে 0.1 (সুতরাং আসুন যে কোনও প্লট থেকে 0.4 এবং 0.5 এর মধ্যে ফাঁক পূরণ করতে পারেন) , 0) থেকে (1,1)?
আনাতোলি আলেক্সিভ

@ এনাটোলি অ্যালেক্সসিভ এই প্রশ্নের উত্তর দেওয়া উচিত ।
ImportanceOfBeingErnest

21

আপনি প্লট পদ্ধতিতে বৃত্তের আকার নির্দিষ্ট করতে মার্কারসাইজ ব্যবহার করতে পারেন

import numpy as np
import matplotlib.pyplot as plt

x1 = np.random.randn(20)
x2 = np.random.randn(20)
plt.figure(1)
# you can specify the marker size two ways directly:
plt.plot(x1, 'bo', markersize=20)  # blue circle with size 10 
plt.plot(x2, 'ro', ms=10,)  # ms is just an alias for markersize
plt.show()

থেকে এখানে

এখানে চিত্র বর্ণনা লিখুন


প্রশ্ন scatterplot সম্পর্কে ছিল, এবং matplotlib দুটি ষড়যন্ত্র ফাংশন (বিভিন্ন পরামিতি আছে markersize জন্য চক্রান্ত , এবং গুলি জন্য ছিটান )। সুতরাং এই উত্তর প্রযোজ্য নয়।
ডম

3
@ ডোম আমি উজ্জীবিত হয়েছি কারণ আমি "পাইপ্লট প্লট চিহ্নিতকারী আকার" অনুসন্ধান করার পরেও এই প্রশ্নটি গুগলে প্রথম ফলাফল হিসাবে পপ আপ হয়, সুতরাং এই উত্তরটি সাহায্য করে।
প্রেজেক ডি

আমি জানি প্লটের পদ্ধতি এবং স্ক্যাটার পদ্ধতিটি প্লটে আলাদা তবে তারা উভয়ই 'স্ক্যাটার প্লট' বুঝতে পারে এবং মার্কারসাইজ সামঞ্জস্য করতে পারে, সুতরাং আপনি উত্তরটি প্লট পদ্ধতিটি ব্যবহার করেন তবে ডম
zhaoqing

18

এটা এলাকায় মার্কার করুন। আমি বলতে চাচ্ছি যদি আপনি s1 = 1000এবং তারপর s2 = 4000, প্রতিটি বৃত্তের ব্যাসার্ধ মধ্যে সম্পর্ক হল: r_s2 = 2 * r_s1। নিম্নলিখিত প্লট দেখুন:

plt.scatter(2, 1, s=4000, c='r')
plt.scatter(2, 1, s=1000 ,c='b')
plt.scatter(2, 1, s=10, c='g')

এখানে চিত্র বর্ণনা লিখুন

পোস্টটি দেখার সময় আমারও একই সন্দেহ ছিল, তাই আমি এই উদাহরণটি দিয়েছিলাম তখন আমি স্ক্রিনে কোনও রাডারকে রেডিআই পরিমাপ করতে ব্যবহার করেছি।


এটি সবচেয়ে পরিষ্কার এবং সবচেয়ে চর্বি মুক্ত উত্তর। ধন্যবাদ
আয়ান মিত্র

6

এই উদ্দেশ্যে প্রথমে আমি 'স্ক্যাটার' ব্যবহার করার চেষ্টাও করেছি। বেশ কিছুটা সময় নষ্ট করার পরে - আমি নিম্নলিখিত সমাধানে স্থির হয়েছি।

import matplotlib.pyplot as plt
input_list = [{'x':100,'y':200,'radius':50, 'color':(0.1,0.2,0.3)}]    
output_list = []   
for point in input_list:
    output_list.append(plt.Circle((point['x'], point['y']), point['radius'], color=point['color'], fill=False))
ax = plt.gca(aspect='equal')
ax.cla()
ax.set_xlim((0, 1000))
ax.set_ylim((0, 1000))
for circle in output_list:    
   ax.add_artist(circle)

এখানে চিত্র বর্ণনা লিখুন

এটি এই প্রশ্নের উত্তরের ভিত্তিতে তৈরি


খুব সহায়ক তবে কেন দুটি লুপ ব্যবহার করবেন?
গ্র্যাভানটোট

1
@ গ্রাবাণটোট কোনও কারণ নেই, এটির মধ্যে খুব বেশি ভাবেননি।
Ike

2

যদি চেনাশোনাগুলির আকারটি প্যারামিটারের বর্গক্ষেত্রের সাথে মিলে যায় s=parameter, তবে আপনি নিজের আকার অ্যারেতে যুক্ত প্রতিটি উপাদানকে একটি বর্গমূল নির্ধারণ করুন:s=[1, 1.414, 1.73, 2.0, 2.24] এটি যখন এই মানগুলি নিয়ে যায় এবং সেগুলি ফেরত দেয়, তখন তাদের আপেক্ষিক আকার বৃদ্ধি হবে বর্গক্ষেত্রের অগ্রগতির বর্গমূল, যা একটি রৈখিক অগ্রগতি প্রদান করে।

যদি আমি যেমন চক্রান্ত আউটপুট পায় প্রতিটি বর্গ ছিল: output=[1, 2, 3, 4, 5]। তালিকা ব্যাখ্যার চেষ্টা করুন:s=[numpy.sqrt(i) for i in s]


1
হওয়া i in outputউচিত নয়?
সিগুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.