Actualmente estoy implementando algo con Python y matplotlib. Sé cómo dibujar polígonos y también cómo llenarlos, pero ¿cómo llené todo excepto el interior de un polígono? Para ser más claro, me gustaría modificar el resultado a continuación, obtenido usando axhspan
y axvspan
, cortando las líneas rojas horizontales y verticales para obtener un rectángulo rojo (fuera de lo cual todo está sombreado como está ahora) : Complementos de relleno de áreas con matplotlib
Respuesta
This post pregunta (y respuestas) esencialmente a esta pregunta. Mire 'Editar 2' en la respuesta aceptada. Describe cómo crear un polígono vectorial del tamaño de los límites de su trazado y luego cómo crear un agujero para que coincida con la forma que desea complementar. Hace esto asignando códigos de línea que definen si el lápiz dibuja o no cuando se mueve.
Aquí es la parte del poste ha hecho referencia anteriormente que es relevante para esta pregunta:
import numpy as np
import matplotlib.pyplot as plt
def main():
# Contour some regular (fake) data
grid = np.arange(100).reshape((10,10))
plt.contourf(grid)
# Verticies of the clipping polygon in counter-clockwise order
# (A triange, in this case)
poly_verts = [(2, 2), (5, 2.5), (6, 8), (2, 2)]
mask_outside_polygon(poly_verts)
plt.show()
def mask_outside_polygon(poly_verts, ax=None):
"""
Plots a mask on the specified axis ("ax", defaults to plt.gca()) such that
all areas outside of the polygon specified by "poly_verts" are masked.
"poly_verts" must be a list of tuples of the verticies in the polygon in
counter-clockwise order.
Returns the matplotlib.patches.PathPatch instance plotted on the figure.
"""
import matplotlib.patches as mpatches
import matplotlib.path as mpath
if ax is None:
ax = plt.gca()
# Get current plot limits
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# Verticies of the plot boundaries in clockwise order
bound_verts = [(xlim[0], ylim[0]), (xlim[0], ylim[1]),
(xlim[1], ylim[1]), (xlim[1], ylim[0]),
(xlim[0], ylim[0])]
# A series of codes (1 and 2) to tell matplotlib whether to draw a line or
# move the "pen" (So that there's no connecting line)
bound_codes = [mpath.Path.MOVETO] + (len(bound_verts) - 1) * [mpath.Path.LINETO]
poly_codes = [mpath.Path.MOVETO] + (len(poly_verts) - 1) * [mpath.Path.LINETO]
# Plot the masking patch
path = mpath.Path(bound_verts + poly_verts, bound_codes + poly_codes)
patch = mpatches.PathPatch(path, facecolor='white', edgecolor='none')
patch = ax.add_patch(patch)
# Reset the plot limits to their original extents
ax.set_xlim(xlim)
ax.set_ylim(ylim)
return patch
if __name__ == '__main__':
main()
Si solo necesita el complemento de un rectángulo, podría dibujar 4 rectángulos a su alrededor (como los 4 rectángulos que se ven en su imagen de ejemplo). Las coordenadas de los bordes de la trama se pueden obtener con xlim()
y ylim()
.
No estoy seguro de que Matplotlib ofrece una manera de pintar el exterior de un polígono ...
- 1. Áreas portátiles Vs áreas de proyectos múltiples?
- 2. selectionStart-End, con áreas de texto
- 3. Excel Get_Range con múltiples áreas
- 4. Áreas de desplazamiento anidadas
- 5. ¿Cartogramas de dibujo con Matplotlib?
- 6. Matplotlib - Histograma escalonado con datos ya agrupados
- 7. relleno con sprintf
- 8. Ampliación de aplicaciones web Java con complementos
- 9. ASP.NET MVC Áreas con distribución compartida
- 10. Alineación vertical con línea de base y áreas de texto
- 11. Sistema con complementos en C#
- 12. barra de progreso Android con relleno
- 13. El rompecabezas "relleno de patrón con mosaicos"
- 14. DataTable de relleno con la matriz
- 15. memoria de relleno con datos aleatorios
- 16. C# Cantidad de relleno con ceros
- 17. Diseño de Bootstrap anidado con relleno
- 18. Problema con el relleno de Internet Explorer
- 19. lista áreas de memoria "frías"
- 20. uso de Áreas en MVC2
- 21. imagen Matplotlib savefig recortar
- 22. BackgroundColorSpan con relleno adicional vertical
- 23. Zipping con relleno en Haskell
- 24. android borde punteado con relleno
- 25. python numpy roll con relleno
- 26. enmascaramiento de una parte de un trazado contourf en matplotlib
- 27. desarrollo de Django complementos
- 28. diagrama de geom_area con áreas y contornos ggplot
- 29. En Android, ¿cómo hago áreas de recorte con formas extrañas?
- 30. Obtener áreas asociadas con un proyecto de MVC
El puesto que se refieren a enmascarar se trata de una imagen de píxeles en 2D. Aunque esta podría ser una solución aproximada a la pregunta, la solución ideal sería a través del dibujo vectorial (no del dibujo de píxeles). – EOL
desplácese hasta 'Edid 2' de la respuesta aceptada, encontrará una solución vectorial. – Paul
Gracias bpowah! De hecho, la función 'mask_outside_polygon' en 'Editar 2' junto con algo de sombreado hizo el truco. –