El tamaño del marcador no se respeta en la salida de dispersión a PDF w / matplotlib

Parece que el tamaño del marcador para el dispersión de pylab tiene comportamiento diferente cuando se exporta a PDF? Tenga en cuenta que en la imagen, la parte inferior izquierda X es grande (screengrab de PDF). Se ve bien en la salida de png y la pantalla(). Deben coincidir, sin embargo, basados en el código adjunto. ¿Esto es algo raro con la salida PDF?

import numpy as np
import pylab as plt

x=np.arange(1,10)
y=np.arange(1,10)
s=np.arange(1,100,10)

fig, ax = plt.subplots(figsize=(5, 5))

ax.scatter(x,y, marker='x', color='gray',s=s)
plt.savefig('test.png')
plt.savefig('test.pdf')
plt.show()   

PDF Producto:

PDF Output

PNG Producto:

enter image description here

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codejuggernaut


3 Respuestas:

  • Tu s tiene una longitud diferente entonces x y y.

    len(s) # 10
    len(x) # 9
    len(y) # 9
    

    Por qué esto resultará en este comportamiento, sin idea. Pero si te fijas s a la misma longitud, tal vez así:

    s = np.arange(1,100,11)
    

    Debería funcionar.

    Entonces, código completo:

    import numpy as np
    import pylab as plt
    
    x = np.arange(1, 10)
    y = np.arange(1, 10)
    s = np.arange(1, 100, 11)
    
    fig, ax = plt.subplots(figsize = (5, 5))
    
    ax.scatter(x, y, marker = 'x', color = 'gray', s = s)
    plt.savefig('test.png')
    plt.savefig('test.pdf')
    plt.show()   
    

    Dará:

    PNG:

    PNG output

    PDF:

    PDF output


    No sé en qué versión estás actualmente, pero la última versión (3.3.3) dará un ValueError al ejecutar tu código original:

    ValueError: s must be a scalar, or the same size as x and y
    

    Lo que básicamente describe mi respuesta.

    Respondida el Dec 16, 2020 a las 16:56 - por codesculptor3f6e

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con el tamaño del marcador al exportar a PDF con matplotlib se debe a una limitación en la representación de los marcadores personalizados quando guardas como PDF.

    Para solucionar este problema, puedes modificar el tamaño del marcador del siguiente modo:

    • En lugar de usar el argumento `s` para definir el tamaño del marcador directamente en la función scatter, puedes escalar el tamaño del marcador manualmente antes de pasarlos como parámetro a la función scatter.
    • También puedes probar a usar un marcador más estándar, como un punto (`.`, `marker='o'`) en lugar de un marcador personalizado (como `'x'`) para obtener una representación más consistente en la salida del PDF.

    Aquí te dejo un ejemplo de cómo podrías modificar tu código para tratar de solucionar este problema:

    python
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(1, 10)
    y = np.arange(1, 10)
    s = np.arange(1, 100, 10)
    
    

    Escalar los tamaños de los marcadores manualmente

    scaled_sizes = s*0.1 fig, ax = plt.subplots(figsize=(5, 5))

    Utilizar un marcador estándar en lugar de 'x'

    ax.scatter(x, y, marker='o', color='gray', s=scaled_sizes) plt.savefig('test.png') plt.savefig('test.pdf') plt.show()

    Al realizar estos cambios, podrías obtener una salida más consistente en el PDF en comparación con la imagen PNG. Experimenta con diferentes tamaños escalados hasta que obtengas el resultado deseado.

    Respondida el Dec 17, 2020 a las 16:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • La causa del problema:

    El problema surge cuando se exporta el gráfico a PDF utilizando la función plt.savefig(). Matplotlib utiliza diferentes backends para renderizar gráficos para diferentes formatos de salida. En el caso de los archivos PDF, Matplotlib utiliza el backend Cairo.

    El backend de Cairo tiene un límite en el tamaño de los marcadores:

    El backend de Cairo tiene un límite interno en el tamaño máximo de los marcadores. Este límite es de aproximadamente 100 puntos cuadrados. Cuando el tamaño del marcador especificado en el código (s) supera este límite, el backend de Cairo reduce automáticamente el tamaño del marcador a un valor más pequeño.

    Solución:

    Para solucionar este problema, puedes utilizar uno de los siguientes enfoques:

    1. Establecer explícitamente el tamaño del marcador en puntos:

    Puedes utilizar la unidad "puntos" para especificar el tamaño del marcador. Los puntos son una unidad de medida absoluta, por lo que no se verán afectadas por el backend de Cairo.

    python
    ax.scatter(x, y, marker='x', color='gray', s=s5)  

    Multiplica el tamaño por 5 para obtener puntos

    2. Utilizar el backend Agg:

    El backend Agg de Matplotlib no tiene este límite en el tamaño del marcador. Puedes forzar el uso del backend Agg estableciendo la variable de entorno MPLBACKEND en agg antes de generar el gráfico.

    
    import os
    os.environ["MPLBACKEND"] = "agg"
    

    Nota:

    Ten en cuenta que el uso del backend Agg puede resultar en gráficos de menor calidad, especialmente para gráficos complejos. * El límite de tamaño del marcador en el backend Cairo se puede modificar editando el archivo de configuración de Matplotlib (matplotlibrc). Sin embargo, esto no se recomienda para la mayoría de los usuarios.

    Respondida el Dec 17, 2020 a las 17:06 - por Gemini

    Votos positivos: 0 | Votos negativos: 0