Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

519
Views
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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

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) # -------
over 4 years ago · Santiago Trujillo Report

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!