• Empleos
  • Sobre nosotros
  • Empleos
    • Inicio
    • Empleos
    • Cursos y retos
  • Empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

424
Vistas
Cómo eliminar espacios entre parches matplotlib adyacentes

Estoy tratando de trazar una colección de datos de elementos finitos con parches de colores utilizados para representar el valor en cada elemento.

Desafortunadamente, cuando trazo los parches, aparecen pequeños espacios entre los parches adyacentes.

He creado un script de ejemplo a continuación para describir el problema.

 import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.collections import PatchCollection nodes = [[0.1, 0.1], [0.25, 0.1], [0.75, 0.9], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9]] elems =[[0,1, 2, 3], [1, 4, 5, 2]] patches = [] for elem in elems: xy = np.array([nodes[i] for i in elem]) elem = mpatches.Polygon(xy, closed=True, snap=False, antialiased=True) patches.append(elem) col = PatchCollection(patches) fig, ax = plt.subplots(1, 1) ax.add_collection(col) plt.show()

Lo que produce la siguiente trama con la brecha no deseada. Ajustar la forma de la ventana de trazado cambia la apariencia del espacio.

Por el momento, mi solución es establecer col.set_edgecolor("face")` e incluir un ancho de borde pequeño. Sin embargo, es difícil establecer el borde para reducir los artefactos cuando hay una variedad de tamaños de parche diferentes.

Por ejemplo, para mis datos reales sin ancho de borde ( edgecolor de borde = ninguno), hay líneas que separan cada elemento. ingrese la descripción de la imagen aquí

Establecer edgecolor="face" con linewidth=1.0 elimina las líneas entre los elementos, pero agrega pequeños artefactos en las esquinas de las celdas. Esto es particularmente visible en la parte frontal de la geometría donde los colores son muy diferentes y los elementos son pequeños. ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Reducir el linewidth de línea a 0.5 reduce el impacto de estos artefactos, pero las líneas entre los elementos más grandes en el medio comienzan a reaparecer. ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

¿Es posible arreglar estas lagunas? Sé que esto es algo pequeño, pero me encantaría tener una forma de trazar mis datos en python sin artefactos.

Intenté configurar snap=False y antialisased=True , pero ninguno tuvo ningún efecto.

almost 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si bien establecer el color de toda la colección elimina la brecha como sugirió @rvd, esto nos limita a 1 color para todos los polígonos:

 col = PatchCollection(patches, color='C0') # limit 1 color per collection

Una solución más robusta es establecer el color de cada polígono y habilitar match_original en la colección:

match_original : si es True , use los colores y anchos de línea de los parches originales.

Esto nos permite tener distintos colores por parche en lugar de 1 color global por colección:

 import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.collections import PatchCollection # use numpy arrays to simplify indexing nodes = np.array([[0.1, 0.1], [0.25, 0.1], [0.75, 0.9], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9]]) elems = np.array([[0, 1, 2, 3], [1, 4, 5, 2]]) colors = np.array(['C0', 'C4']) # color per elem # set color per polygon patches = [mpatches.Polygon(nodes[e], color=c) for e, c in zip(elems, colors)] # ------- # retain original polygon colors collection = PatchCollection(patches, match_original=True) # ------------------- fig, ax = plt.subplots() ax.add_collection(collection) plt.show()

Por supuesto, si solo desea un color, puede quitar el zip y simplemente configurar un solo color (siempre que match_original esté habilitado en la colección):

 patches = [mpatches.Polygon(nodes[e], color='C0') for e in elems] collection = PatchCollection(patches, match_original=True)


Actualización: como no puedo reproducir los artefactos usando los datos de muestra, intente usar estas opciones adicionales de su parte:

  • rasterized=True y linewidth=0 en la colección
  • dpi=600 (o superior) al guardar la figura
 import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.collections import PatchCollection # use numpy arrays to simplify indexing nodes = np.array([[0.1, 0.1], [0.25, 0.1], [0.75, 0.9], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9]]) elems = np.array([[0, 1, 2, 3], [1, 4, 5, 2]]) colors = np.array(['C0', 'C4']) # color per elem # set color per polygon patches = [mpatches.Polygon(nodes[e], color=c) for e, c in zip(elems, colors)] # ------- # retain original polygon colors collection = PatchCollection(patches, snap=True, match_original=True, rasterized=True, linewidth=0) # ------------------- --------------- ----------- fig, ax = plt.subplots() ax.add_collection(collection) fig.savefig('fe.png', dpi=600) # -------
almost 4 years ago · Santiago Trujillo Denunciar

0

Puede arreglar esto usando los colores de PatchCollection y diferentes PatchCollections.

PatchCollection -> sin líneas, incluso sin edgecolors y sin linewidth=0

 import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.collections import PatchCollection nodes = [[0.1, 0.1], [0.25, 0.1], [0.75, 0.9], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9]] elems = [[0, 1, 2, 3], [1, 4, 5, 2]] collections = [] for elem in elems: xy = np.array([nodes[i] for i in elem], dtype=float) collections.append(PatchCollection([mpatches.Polygon(xy)], snap=True, color='black')) fig, ax = plt.subplots(1, 1) for col in collections: ax.add_collection(col) plt.show()

ingrese la descripción de la imagen aquí

No tengo idea de por qué esto funciona.

Editar: se aplicaron las sugerencias de tdy de los comentarios.

almost 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda