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
w plt.scatter
oznacza markersize**2
. Jak mówi dokumentacja
s
: skalarny lub tablicowy, kształt (n,), opcjonalny
rozmiar w punktach ^ 2. Domyślnie jest to rcParams ['lines.markersize'] ** 2.
Moż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)
.
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 s
parametr?
Oczywiście jednostki punktów ** 2 to jednostki powierzchni.
- W szczególnym przypadku znacznika kwadratowego
marker="s"
obszar znacznika jest rzeczywiście bezpośrednio wartością s
parametru.
- W przypadku koła jego powierzchnia to
area = pi/4*s
.
- W przypadku innych markerów może nie być nawet oczywisty związek z obszarem markera.
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
),
1 point == fig.dpi/72. pixels
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:
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()
Jeśli jesteś zainteresowany rozproszeniem w jednostkach danych, sprawdź tę odpowiedź .