rozmiar markera punktowego pyplot scatter
W dokumencie pyplot dla wykresu punktowego:
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)
Rozmiar markera
S: rozmiar w punktach^2. Jest skalarem lub tablicą o tej samej długości co x i y.
Co to za Jednostka points^2
? Co to znaczy? Czy s=100
oznacza 10 pixel x 10 pixel
?
W zasadzie staram się aby wykresy rozproszone o różnych rozmiarach znaczników, i chcę dowiedzieć się, co oznacza liczba s
.
6 answers
Może to być nieco mylący sposób definiowania rozmiaru, ale zasadniczo określasz obszar znacznika. Oznacza to, że aby podwoić szerokość (lub wysokość) znacznika, należy zwiększyć s
o współczynnik 4. [ponieważ A = w H = > (2W) (2H) = 4A]
Jest jednak powód, dla którego wielkość markerów jest zdefiniowana w ten sposób. Ze względu na skalowanie obszaru jako kwadratu szerokości, podwojenie szerokości faktycznie wydaje się zwiększać rozmiar o więcej niż czynnik 2 (w rzeczywistości zwiększa go o czynnik 4). Aby to zobaczyć, rozważ następujące dwa przykłady i wyniki, które wytwarzają.
# 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()
Daje
Zauważ, jak rozmiar rośnie bardzo szybko. Jeśli zamiast tego mamy
# 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()
Daje
Teraz pozorna wielkość markerów zwiększa się mniej więcej liniowo w intuicyjny sposób.
Jeśli chodzi o dokładne znaczenie tego, czym jest "punkt", jest to dość arbitralne dla celów kreślarskich, możesz po prostu skalować wszystkie rozmiary o stałą, aż będą wyglądać rozsądnie.
Mam nadzieję, że to pomoże!Edit: (w odpowiedzi na komentarz od @ Emma)
To pewnie mylące sformułowanie z mojej strony. Pytanie o podwojenie szerokości okręgu, więc na pierwszym zdjęciu dla każdego okręgu (gdy przechodzimy od lewej do prawej) jego szerokość jest dwukrotnie większa niż poprzednia, więc dla obszaru jest to wykładnik z podstawą 4. Podobnie drugi przykład każdy okrąg ma obszar podwajamy ostatni, co daje wykładnik z bazą 2.Jednak jest to drugi przykład (gdzie skalujemy obszar), że obszar podwajający wydaje się, że okrąg jest dwa razy większy dla oka. Tak więc, jeśli chcemy, aby okrąg miał współczynnik n
większy, zwiększymy obszar o czynnik n
, a nie promień, więc pozorna wielkość skaluje się liniowo z obszarem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 16:40:36
ponieważ inne odpowiedzi tutaj twierdzą, że s
oznacza obszar markera, dodaję tę odpowiedź, aby wyjaśnić, że niekoniecznie tak jest.
Rozmiar w punktach^2
Argument s
w plt.scatter
oznacza markersize**2
. Jak mówi dokumentacja
Można to wziąć dosłownie. W celu uzyskaj znacznik, który jest duży x punktów, musisz kwadratować tę liczbę i dać ją argumentowi
s
: Skalar lub array_like, shape( n,), opcjonalne
rozmiar w punktach^2. Domyślnie jest to linia rcParams ['.markersize'] * * 2.
s
.
Więc zależność między rozmiarem markera wykresu linii a rozmiarem rozrzutu jest kwadratem. W celu uzyskania znacznika punktowego o tej samej wielkości, co znacznik punktowy o rozmiarze 10 punktów, należy wywołać 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()
Połączenie z "obszarem"
Dlaczego więc inne odpowiedzi, a nawet dokumentacja mówią o " obszarze" jeśli chodzi o parametr s
?
Oczywiście jednostki punktów * * 2 są jednostkami powierzchni.
- dla specjalnego przypadku znacznika kwadratowego,
marker="s"
, powierzchnia znacznika jest rzeczywiście bezpośrednio wartością parametrus
. - dla okręgu powierzchnia okręgu wynosi
area = pi/4*s
. - dla innych markerów nie może być nawet żadnej oczywistej relacji do obszaru markera.
We wszystkich przypadkach jednak obszar znacznik jest proporcjonalny do parametru s
. Jest to motywacja do nazwania go "obszarem", chociaż w większości przypadków tak naprawdę nie jest.
Określenie wielkości markerów rozpraszających w odniesieniu do pewnej ilości, która jest proporcjonalna do obszaru markera, ma na razie sens, ponieważ jest to obszar markera postrzegany przy porównywaniu różnych plam, a nie jego długości boku lub średnicy. Tj. podwojenie podstawowej ilości powinno podwoić powierzchnię marker.
Co to są punkty?
Jak dotąd odpowiedź na to, co oznacza rozmiar znacznika scatter, jest podawana w jednostkach punktów. Punkty są często używane w typografii, gdzie czcionki są określone w punktach. Również liniowce są często określane w punktach. Standardowy rozmiar punktów w matplotlib to 72 punkty na cal (ppi) - 1 punkt to zatem 1/72 cala.
Może być przydatne, aby móc określić rozmiary w pikselach zamiast punktów. Jeśli rysunek dpi wynosi również 72, jeden punkt to jeden piksel. Jeśli cyfra dpi jest inna (domyślnie matplotlib to fig.dpi=100
),
1 point == fig.dpi/72. pixels
Podczas gdy rozmiar znacznika scatter w punktach wyglądałby inaczej dla różnych cyfr dpi, można by wytworzyć znacznik 10 na 10 pikseli^2, który zawsze miał taką samą liczbę pikseli pokrytych:
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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 00:49:20
Jest to obszar markera. Chodzi mi o to, że masz s1 = 1000
i wtedy s2 = 4000
, zależność między promieniem każdego okręgu wynosi: r_s2 = 2 * r_s1
. Zobacz następujący wykres:
plt.scatter(2, 1, s=4000, c='r')
plt.scatter(2, 1, s=1000 ,c='b')
plt.scatter(2, 1, s=10, c='g')
Miałem takie same wątpliwości, kiedy zobaczyłem post, więc zrobiłem ten przykład, a następnie użyłem linijki na ekranie do pomiaru promieni.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 19:40:43
Możesz użyć markersize aby określić rozmiar okręgu w metodzie plot
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()
From here
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 06:54:20
Starałem się również początkowo użyć "scatter" w tym celu. Po dość zmarnowanym czasie-zdecydowałem się na następujące rozwiązanie.
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)
Jest to odpowiedź na to pytanie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 18:20:46
Jeśli rozmiar okręgów odpowiada Kwadratowi parametru w s=parameter
, to Przypisz pierwiastek kwadratowy do każdego elementu dołączonego do tablicy rozmiarów, tak: s=[1, 1.414, 1.73, 2.0, 2.24]
tak, że gdy pobiera te wartości i zwraca je, ich względny wzrost będzie pierwiastkiem kwadratowym kwadratowego postępu, który zwraca postęp liniowy.
Gdybym miał kwadrat każdy z nich, jak dostaje wyjście do wykresu: output=[1, 2, 3, 4, 5]
. Wypróbuj interpretację listy: s=[numpy.sqrt(i) for i in s]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-05 19:37:50