Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

523
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda