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.

Author: LWZ, 2013-02-12

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

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

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.

 258
Author: Dan,
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

s : Skalar lub array_like, shape( n,), opcjonalne
rozmiar w punktach^2. Domyślnie jest to linia rcParams ['.markersize'] * * 2.

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.

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).

Tutaj wpisz opis obrazka

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ą parametru s.
  • 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.

Tutaj wpisz opis obrazka

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.

Tutaj wpisz opis obrazka

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:

Tutaj wpisz opis obrazka Tutaj wpisz opis obrazka Tutaj wpisz opis obrazka

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() 
 78
Author: ImportanceOfBeingErnest,
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')

Tutaj wpisz opis obrazka

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.

 12
Author: Joaquin,
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

Tutaj wpisz opis obrazka

 11
Author: zhaoqing,
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)

Tutaj wpisz opis obrazka

Jest to odpowiedź na to pytanie

 2
Author: Ike,
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]

 1
Author: user34028,
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