how - plot title font size matplotlib
TamaƱo del marcador (6)
Es el área del marcador. Quiero decir que si tienes s1 = 1000
y luego s2 = 4000
, la relación entre el radio de cada círculo es: r_s2 = 2 * r_s1
. Vea la siguiente trama:
plt.scatter(2, 1, s=4000, c=''r'')
plt.scatter(2, 1, s=1000 ,c=''b'')
plt.scatter(2, 1, s=10, c=''g'')
Tenía la misma duda cuando vi la publicación, así que hice este ejemplo y luego usé una regla en la pantalla para medir los radios.
En el documento pyplot para el diagrama de dispersión:
matplotlib.pyplot.scatter (x, y, s = 20, c = ''b'', marcador = ''o'', cmap = Ninguno, norma = Ninguno, vmin = Ninguno, vmax = Ninguno, alfa = Ninguno, líneas de ancho = Ninguno, faceted = True, verts = None, hold = None, ** kwargs)
El tamaño del marcador
s: tamaño en puntos ^ 2. Es un escalar o una matriz de la misma longitud que x e y.
¿Qué tipo de unidad son los points^2
? Qué significa eso? ¿ s=100
significa 10 pixel x 10 pixel
?
Básicamente, estoy tratando de hacer diagramas de dispersión con diferentes tamaños de marcadores, y quiero averiguar qué significa el número s
.
Esta puede ser una forma un tanto confusa de definir el tamaño, pero básicamente está especificando el área del marcador. Esto significa que, para duplicar el ancho (o altura) del marcador, necesita aumentar s
en un factor de 4. [porque A = W H => (2W) (2H) = 4A]
Sin embargo, hay una razón por la que el tamaño de los marcadores se define de esta manera. Debido a la escala del área como el cuadrado del ancho, la duplicación del ancho parece aumentar el tamaño en más de un factor 2 (de hecho, lo aumenta en un factor de 4). Para ver esto, considere los siguientes dos ejemplos y la salida que producen.
# 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()
da
Observe cómo el tamaño aumenta muy rápidamente. Si por el contrario tenemos
# 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()
da
Ahora, el tamaño aparente de los marcadores aumenta de forma aproximadamente lineal de una manera intuitiva.
En cuanto al significado exacto de lo que es un "punto", es bastante arbitrario para propósitos de trazado, puedes escalar todos tus tamaños en una constante hasta que parezcan razonables.
¡Espero que esto ayude!
Edición: (En respuesta al comentario de @Emma)
Probablemente es una redacción confusa de mi parte. La pregunta que se hace acerca de duplicar el ancho de un círculo es que, en la primera imagen de cada círculo (a medida que avanzamos de izquierda a derecha), el ancho es el doble que el anterior, por lo que para el área es exponencial con la base 4. De manera similar, el segundo ejemplo Cada círculo tiene un área doble la última que da un exponencial con base 2.
Sin embargo, es el segundo ejemplo (donde estamos escalando el área) donde el área de duplicación parece hacer que el círculo sea el doble de grande para el ojo. Por lo tanto, si queremos que un círculo parezca un factor n
más grande, aumentaríamos el área en un factor n
no en el radio, por lo que el tamaño aparente se escalará linealmente con el área.
Puede usar markersize para especificar el tamaño del círculo en el método de trazado
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()
Desde here
Si el tamaño de los círculos corresponde al cuadrado del parámetro en s=parameter
, entonces asigne una raíz cuadrada a cada elemento que agregue a su matriz de tamaño, como esto: s=[1, 1.414, 1.73, 2.0, 2.24]
tal que cuando toma estos valores y los devuelve, su aumento de tamaño relativo será la raíz cuadrada de la progresión cuadrada, que devuelve una progresión lineal.
Si tuviera que cuadrar cada uno a medida que obtiene salida a la gráfica: output=[1, 2, 3, 4, 5]
. Intente la interpretación de la lista: s=[numpy.sqrt(i) for i in s]
También intenté usar "dispersión" inicialmente para este propósito. Después de un poco de tiempo perdido, me decidí por la siguiente solución.
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)
Esto se basa en una respuesta a esta pregunta.
Debido a que otras respuestas aquí afirman que s
denota el área del marcador, estoy agregando esta respuesta para aclarar que este no es necesariamente el caso.
Tamaño en puntos ^ 2
El argumento s
en plt.scatter
denota el markersize**2
. Como dice la documentación.
s
: escalar o array_like, forma (n,), opcional
tamaño en puntos ^ 2. El valor predeterminado es rcParams [''lines.markersize''] ** 2.
Esto se puede tomar literalmente. Para obtener un marcador que tenga x puntos de gran tamaño, debe cuadrar ese número y asignarlo al argumento s
.
Entonces, la relación entre el tamaño de una trama de línea y el argumento del tamaño de dispersión es el cuadrado. Para producir un marcador de dispersión del mismo tamaño que un marcador de trazado de tamaño de 10 puntos, por lo tanto, se denomina 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()
Conexión a "área"
Entonces, ¿por qué otras respuestas e incluso la documentación hablan de "área" cuando se trata del parámetro s
?
Por supuesto, las unidades de puntos ** 2 son unidades de área.
- Para el caso especial de un marcador cuadrado,
marker="s"
, el área del marcador es, de hecho, directamente el valor del parámetros
. - Para un círculo, el área del círculo es
area = pi/4*s
. - Para otros marcadores, puede que ni siquiera haya una relación obvia con el área del marcador.
En todos los casos, sin embargo, el área del marcador es proporcional al parámetro s
. Esta es la motivación para llamarlo "área", aunque en la mayoría de los casos no lo es.
Especificar el tamaño de los marcadores de dispersión en términos de cierta cantidad que es proporcional al área del marcador tiene sentido hasta ahora, ya que es el área del marcador que se percibe cuando se comparan diferentes parches en lugar de su longitud lateral o diámetro. Es decir, duplicar la cantidad subyacente debe duplicar el área del marcador.
¿Qué son los puntos?
Hasta ahora, la respuesta a lo que significa el tamaño de un marcador de dispersión se da en unidades de puntos. Los puntos se utilizan a menudo en tipografía, donde las fuentes se especifican en puntos. También los anchos de línea a menudo se especifican en puntos. El tamaño estándar de los puntos en matplotlib es de 72 puntos por pulgada (ppi); por lo tanto, 1 punto es 1/72 pulgadas.
Puede ser útil poder especificar tamaños en píxeles en lugar de puntos. Si la cifra de ppp es 72 también, un punto es un píxel. Si la cifra de ppp es diferente (el valor predeterminado de fig.dpi=100
es fig.dpi=100
),
1 point == fig.dpi/72. pixels
Si bien el tamaño del marcador de dispersión en puntos se vería diferente para diferentes ppp de figura, se podría producir un marcador de 2 por 10 píxeles ^ 2, que siempre tendría el mismo número de píxeles cubiertos:
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()