diagtwig de dispersión pyplot tamaño del marcador

En el documento pyplot para diagtwig de dispersión:

matplotlib.pyplot.scatter (x, y, s = 20, c = ‘b’, marcador = ‘o’, cmap = Ninguno, norma = Ninguno, vmin = Ninguno, vmax = Ninguno, alfa = Ninguno, anchos de línea = 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 xey.

¿Qué tipo de unidad son points^2 ? Qué significa eso? ¿ s=100 significa 10 pixel x 10 pixel ?

Básicamente, estoy tratando de hacer diagtwigs 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 se especifica el área del marcador. Esto significa que, para duplicar el ancho (o la altura) del marcador, necesita boost s por 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 de ancho, duplicar el ancho parece boost 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.

 # 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

enter image description here

Observe cómo el tamaño aumenta muy rápidamente. Si en cambio 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

enter image description here

Ahora el tamaño aparente de los marcadores aumenta aproximadamente de forma lineal de una manera intuitiva.

En cuanto al significado exacto de lo que es un ‘punto’, es bastante arbitrario para fines de trazado, puede escalar todos sus tamaños por una constante hasta que se vean razonables.

¡Espero que esto ayude!

Editar: (En respuesta al comentario de @Emma)

Probablemente sea una redacción confusa de mi parte. La pregunta sobre duplicar el ancho de un círculo es tal que en la primera imagen de cada círculo (a medida que avanzamos de izquierda a derecha) su ancho es el doble que el anterior, por lo que para el área es exponencial con base 4. De manera similar, el segundo ejemplo cada círculo tiene área doble que la última que da una exponencial con base 2.

Sin embargo, es el segundo ejemplo (donde estamos escalando el área) que el área duplicada parece hacer que el círculo sea dos veces más grande para el ojo. Por lo tanto, si queremos que un círculo aparezca como un factor de n más grande, boostíamos el área por un factor n no por el radio, de modo que el tamaño aparente se escala linealmente con el área.

Como 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 puede tomarse literalmente. Para obtener un marcador que sea x puntos grandes, necesita cuadrar ese número y dárselo al argumento s .

Entonces, la relación entre el tamaño de marcador de un gráfico de líneas y el argumento de 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 10 puntos, por lo tanto, se llamará scatter( .., s=100) .

enter image description here

 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ámetro s .
  • Para un círculo, el área del círculo es area = pi/4*s .
  • Para otros marcadores, puede que no haya ninguna relación obvia con el área del marcador.

enter image description here

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 es así.

Especificar el tamaño de los marcadores de dispersión en términos de alguna cantidad que es proporcional al área del marcador lo hace en el sentido hasta ahora, 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, doblar la cantidad subyacente debería duplicar el área del marcador.

enter image description here

¿Cuáles 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 fonts 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) – 1 punto es, por lo tanto, 1/72 pulgadas.

Puede ser útil poder especificar tamaños en píxeles en lugar de puntos. Si la cifra de dpi es 72 también, un punto es un píxel. Si la cifra dpi es diferente (matplotlib por defecto 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 figuras, uno podría producir un marcador de 10 por 10 píxeles ^ 2, que siempre tendría el mismo número de píxeles cubiertos:

enter image description here enter image description here enter image description here

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

Es el área del marcador. Quiero decir, 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 gráfica:

 plt.scatter(2, 1, s=4000, c='r') plt.scatter(2, 1, s=1000 ,c='b') plt.scatter(2, 1, s=10, c='g') 

enter image description here

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.

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

De aquí

enter image description here

También intenté usar ‘scatter’ inicialmente para este propósito. Después de un tiempo perdido, decidí 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) 

enter image description here

Esto se basa en una respuesta a esta pregunta

Si el tamaño de los círculos corresponde al cuadrado del parámetro en s=parameter , asigne una raíz cuadrada a cada elemento que añada a su matriz de tamaños, como este: s=[1, 1.414, 1.73, 2.0, 2.24] tales 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 sale a la ttwig: output=[1, 2, 3, 4, 5] . Pruebe la interpretación de la lista: s=[numpy.sqrt(i) for i in s]