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 znacznika
s: rozmiar w punktach ^ 2. Jest to skalar lub tablica o tej samej długości co xiy.
Co to za jednostka points^2
? Co to znaczy? Ma s=100
na myśli 10 pixel x 10 pixel
?
Zasadniczo staram się tworzyć wykresy rozrzutu o różnych rozmiarach znaczników i chcę dowiedzieć się, co oznacza s
liczba.
s=20
, że rozmiar znacznika jest równy rozmiarowifontsize=20
litery?fontsize=20
litera ma 20 pkt wysokości (lub cokolwiek znak odniesienia w czcionce ma wysokość 20 pkt).matplotlib.pyplot.plot()
mams
parametr (markersize
) równoważnymatplotlib.pyplot.scatter()
parametrowis
(size
). Tylko przypomnienie ..Odpowiedzi:
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, musisz zwiększyć
s
go o współczynnik 4. [ponieważ A = W H => (2W) (2H) = 4A]Istnieje jednak powód, dla którego wielkość markerów jest definiowana w ten sposób. Z powodu skalowania obszaru jako kwadratu szerokości, podwojenie szerokości faktycznie wydaje się zwiększać rozmiar o współczynnik większy niż 2 (w rzeczywistości zwiększa go o współczynnik 4). Aby to zobaczyć, rozważ następujące dwa przykłady i dane wyjściowe, które one generują.
daje
Zauważ, że rozmiar bardzo szybko rośnie. Jeśli zamiast tego mamy
daje
Teraz pozorny rozmiar znaczników zwiększa się mniej więcej liniowo w intuicyjny sposób.
Jeśli chodzi o dokładne znaczenie tego, czym jest „punkt”, jest dość arbitralne do celów kreślenia, możesz po prostu skalować wszystkie swoje rozmiary o stałą, aż będą wyglądać rozsądnie.
Mam nadzieję że to pomoże!
Edycja: (W odpowiedzi na komentarz @Emma)
Prawdopodobnie jest to mylące sformułowanie z mojej strony. Pytanie o podwojenie szerokości koła, więc na pierwszym obrazie dla każdego koła (gdy poruszamy się od lewej do prawej) jego szerokość jest dwa razy większa od poprzedniego, więc dla obszaru jest to wykładnicza podstawa 4. Podobnie drugi przykład każde koło ma powierzchnię dwukrotnie większą niż ostatnia, co daje wykładnik z podstawą 2.
Jednak jest to drugi przykład (w którym skalujemy obszar), że podwojenie obszaru sprawia, że okrąg jest dwa razy większy dla oka. Zatem jeśli chcemy, aby okrąg wyglądał na czynnik
n
większy, zwiększalibyśmy obszar o czynnik, an
nie promień, więc pozorny rozmiar skaluje się liniowo z obszarem.Edytuj, aby wizualizować komentarz autorstwa @TomaszGandor:
Tak to wygląda dla różnych funkcji rozmiaru znacznika:
źródło
s
wartość zgodnie z rozmiarem okna figury? To znaczy, jeśli zmaksymalizujemy okna figury, chciałbym mieć znaki większego rozmiaru.4 ** n
a2 ** n
, alen ** 4
in ** 2
. Z2 ** n
drugiego wykresu nie skaluje się liniowo pod względem średnicy koła. Nadal idzie za szybko (po prostu nie za dużo).Ponieważ inne odpowiedzi tutaj twierdzą, że
s
oznacza obszar znacznika, dodaję tę odpowiedź, aby wyjaśnić, że niekoniecznie tak jest.Rozmiar w punktach ^ 2
Argument
s
wplt.scatter
oznaczamarkersize**2
. Jak mówi dokumentacjaMożna to potraktować dosłownie. Aby uzyskać znacznik, który jest duży x punktów, musisz wyprostować tę liczbę i podać ją
s
argumentowi.Tak więc związek między znacznikiem wielkości wykresu liniowego a argumentem rozmiaru rozproszenia jest kwadratem. Aby wytworzyć znacznik rozproszenia o tym samym rozmiarze, co znacznik wykresu o wielkości 10 punktów, nazwałbyś go
scatter( .., s=100)
.Połączenie z „obszarem”
Dlaczego więc inne odpowiedzi, a nawet dokumentacja mówią o „obszarze”, jeśli chodzi o
s
parametr?Oczywiście jednostki punktów ** 2 to jednostki powierzchni.
marker="s"
obszar znacznika jest rzeczywiście bezpośrednio wartościąs
parametru.area = pi/4*s
.We wszystkich przypadkach obszar znacznika jest jednak proporcjonalny do
s
parametru . Jest to motywacja, by nazwać to „obszarem”, chociaż w większości przypadków tak nie jest.Określanie wielkości znaczników rozproszenia pod względem pewnej ilości, która jest proporcjonalna do obszaru markera, ma jak dotąd sens, ponieważ to obszar markera jest postrzegany przy porównywaniu różnych łat, a nie jego długości lub średnicy z boku. To znaczy podwojenie bazowej ilości powinno podwoić powierzchnię markera.
Jakie są punkty?
Jak dotąd odpowiedź na pytanie, co oznacza rozmiar znacznika rozproszenia, jest podana w jednostkach punktów. Punkty są często używane w typografii, gdzie czcionki są określone w punktach. Także szerokości linii są często określone w punktach. Standardowy rozmiar punktów w matplotlib wynosi 72 punkty na cal (ppi) - 1 punkt to zatem 1/72 cala.
Przydatne może być określenie rozmiarów w pikselach zamiast punktach. Jeśli dpi również wynosi 72, jeden punkt to jeden piksel. Jeśli rozdzielczość rysunku jest inna (domyślnie jest to Matplotlib
fig.dpi=100
),Chociaż rozmiar znacznika rozproszenia w punktach wyglądałby inaczej dla różnych dpi w postaci cyfr, można by uzyskać znacznik 10 na 10 pikseli ^ 2, który zawsze miałby taką samą liczbę pokrytych pikseli:
Jeśli jesteś zainteresowany rozproszeniem w jednostkach danych, sprawdź tę odpowiedź .
źródło
Możesz użyć markersize, aby określić rozmiar okręgu w metodzie wydruku
od tutaj
źródło
Jest to obszar znacznika. To znaczy, jeśli masz
s1 = 1000
czyms2 = 4000
relacja między promieniem każdym okręgu jest:r_s2 = 2 * r_s1
. Zobacz następujący wątek:Miałem te same wątpliwości, kiedy zobaczyłem słupek, więc zrobiłem ten przykład, a następnie użyłem linijki na ekranie, aby zmierzyć promienie.
źródło
Na początku próbowałem również użyć „rozproszenia”. Po dość marnowanym czasie zdecydowałem się na następujące rozwiązanie.
Jest to oparte na odpowiedzi na to pytanie
źródło
Jeśli rozmiar okręgów odpowiada kwadratowi parametru w
s=parameter
, to przypisz pierwiastek kwadratowy do każdego elementu, który dołączasz do tablicy rozmiarów, w ten sposób:s=[1, 1.414, 1.73, 2.0, 2.24]
tak, że gdy pobierze te wartości i zwróci je, ich względny wzrost wielkości będzie wynosić pierwiastek kwadratowy z kwadratowej progresji, która zwraca liniową progresję.Gdybym był do kwadratu każdy robi jak wyjście do działki:
output=[1, 2, 3, 4, 5]
. Spróbuj interpretacji listy:s=[numpy.sqrt(i) for i in s]
źródło
i in output
powinno być?