En el documento de pyplot para el diagrama de dispersión:
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)
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 es 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 marcador, y quiero averiguar qué significa el s
número.
s=20
decir que el tamaño del marcador es igual al de unafontsize=20
letra?fontsize=20
letra tendrá 20 pts de alto (o el carácter de referencia en la fuente tendrá 20 pts de alto).matplotlib.pyplot.plot()
tienems
parámetro (markersize
) un equivalente paramatplotlib.pyplot.scatter()
parámetros
(size
). Solo un recordatorio ..Respuestas:
Esta puede ser una forma algo 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, debe aumentar
s
en un factor de 4. [porque A = W H => (2W) (2H) = 4A]Sin embargo, hay una razón por la cual el tamaño de los marcadores se define de esta manera. Debido a la escala del área como el cuadrado del ancho, duplicar el ancho en realidad 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 el resultado que producen.
da
Observe cómo el tamaño aumenta muy rápidamente. Si en cambio tenemos
da
Ahora, el tamaño aparente de los marcadores aumenta aproximadamente linealmente de manera intuitiva.
En cuanto al significado exacto de lo que es un "punto", es bastante arbitrario para propósitos de trazado, puede escalar todos sus tamaños por una constante hasta que parezcan razonables.
¡Espero que esto ayude!
Editar: (en respuesta al comentario de @Emma)
Probablemente sea una redacción confusa de mi parte. La pregunta fue sobre duplicar el ancho de un círculo, por lo que en la primera imagen para cada círculo (a medida que nos movemos de izquierda a derecha) su ancho es el doble del 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 al último, lo que da un exponencial con base 2.
Sin embargo, es el segundo ejemplo (donde estamos escalando el área) que el área de duplicación parece hacer que el círculo sea dos veces más grande a la vista. Por lo tanto, si queremos que un círculo parezca un factor
n
mayor, aumentaríamos el área en un factor quen
no sea el radio, de modo que el tamaño aparente se escala linealmente con el área.Edite para visualizar el comentario de @TomaszGandor:
Esto es lo que parece para diferentes funciones del tamaño del marcador:
fuente
s
valor de acuerdo con el tamaño de la ventana de la figura? Quiero decir, si maximizamos las ventanas de la figura, me gustaría tener marcas de mayor tamaño.4 ** n
y2 ** n
, peron ** 4
yn ** 2
. Con2 ** n
el segundo gráfico no se escala linealmente en términos de diámetro del círculo. Todavía va demasiado rápido (pero no demasiado por encima).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
enplt.scatter
denota elmarkersize**2
. Como dice la documentaciónEsto se puede tomar literalmente. Para obtener un marcador que sea x puntos grandes, debe cuadrar ese número y asignarlo al
s
argumento.Entonces, la relación entre el tamaño del marcador de un diagrama lineal 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 trama de 10 puntos, debería llamar
scatter( .., s=100)
.Conexión a "área"
Entonces, ¿por qué otras respuestas e incluso la documentación hablan sobre "área" cuando se trata del
s
parámetro?Por supuesto, las unidades de puntos ** 2 son unidades de área.
marker="s"
, el área del marcador es directamente el valor dels
parámetro.area = pi/4*s
.En todos los casos, sin embargo, el área del marcador es proporcional al
s
parámetro . Esta es la motivación para llamarlo "área", aunque en la mayoría de los casos no lo es realmente.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, ya que es el área del marcador que se percibe al comparar diferentes parches en lugar de su longitud lateral o diámetro. Es decir, duplicar la cantidad subyacente debería 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 usan 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 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 dpi también es 72, un punto es un píxel. Si la cifra de dpi es diferente (el valor predeterminado de matplotlib es
fig.dpi=100
),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 ^ 2 de 10 por 10 píxeles, que siempre tendría el mismo número de píxeles cubiertos:
Si está interesado en una dispersión en unidades de datos, marque esta respuesta .
fuente
Puede usar markersize para especificar el tamaño del círculo en el método de trazado
Desde aqui
fuente
Es el área del marcador. Es decir, si usted tiene
s1 = 1000
y luegos2 = 4000
, la relación entre el radio de cada círculo es:r_s2 = 2 * r_s1
. Ver la siguiente trama:Tuve 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.
fuente
También intenté usar 'dispersión' inicialmente para este propósito. Después de perder un poco de tiempo, me decidí por la siguiente solución.
Esto se basa en una respuesta a esta pregunta
fuente
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, de esta manera: des=[1, 1.414, 1.73, 2.0, 2.24]
modo que cuando tome estos valores y los devuelva, su aumento de tamaño relativo será La raíz cuadrada de la progresión al cuadrado, que devuelve una progresión lineal.Si tuviera que al cuadrado cada uno como se pone de salida a la parcela:
output=[1, 2, 3, 4, 5]
. Prueba la interpretación de la lista:s=[numpy.sqrt(i) for i in s]
fuente
i in output
no debería?