Заполнение областей с помощью matplotlib - PullRequest
7 голосов
/ 27 января 2011

Я сейчас что-то реализую с помощью Python и matplotlib.Я знаю, как рисовать многоугольники, а также как их заполнять, но как мне заполнить все , кроме внутри многоугольника?Чтобы быть более понятным, я бы хотел изменить приведенный ниже результат, полученный с использованием axhspan и axvspan, путем отсечения горизонтальных и вертикальных красных линий, чтобы получить красный прямоугольник (за пределами которого все заштрихованоэто сейчас): enter image description here

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Этот пост задает (и отвечает) по существу этот вопрос. Посмотрите на «Редактировать 2» в принятом ответе. В нем описывается, как создать векторный многоугольник размером с границы графика, а затем создать в нем отверстие, соответствующее форме, которую вы хотите дополнить. Это достигается путем назначения линейных кодов, которые определяют, будет ли перо рисовать при перемещении.

Вот часть вышеупомянутой публикации, которая имеет отношение к этому вопросу:

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()
1 голос
/ 27 января 2011

Если вам нужно только дополнение прямоугольника, вы можете вместо этого нарисовать 4 прямоугольника вокруг него (например, 4 прямоугольника, которые видны на вашем примере изображения).Координаты краев графика можно получить с помощью xlim() и ylim().

. Я не уверен, что Matplotlib предлагает способ рисования за пределами полигона ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...