Построение линии на нескольких графиках - PullRequest
18 голосов
/ 27 мая 2011

Я не знаю, как эта вещь называется или даже как ее описать, поэтому название может быть немного вводящим в заблуждение

Первый прикрепленный график был создан с помощью pyplot.Я хотел бы нарисовать прямую линию, которая проходит через все графики вместо трех красных точек, которые я сейчас использую.Возможно ли это в pyplot?Второе изображение - это то, что я ищу.Currently What I am looking for

Ответы [ 4 ]

27 голосов
/ 27 мая 2011

Вы можете сделать это, отключив отсечение для соответствующих строк.Вероятно, есть более чистый способ сделать это - вы могли бы рисовать линии непосредственно на главном фрейме - но у меня сработало следующее:

from matplotlib import pyplot as plt
from numpy import arange, sin, cos

xx = arange(100)
cut = (xx > 0) & (xx % 17 == 0)
y1 = sin(xx)
y2 = (xx**2) % 2.0+cos(xx+0.5)

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(xx, y1, c="blue",zorder=1)
ax1.scatter(xx[cut], y1[cut], c="red",zorder=2)
ax2 = fig.add_subplot(212)
ax2.plot(xx, y2, c="green",zorder=1)
ax2.scatter(xx[cut], y2[cut], c="red",zorder=2)

for x in xx[cut]:
    ax1.axvline(x=x,ymin=-1.2,ymax=1,c="red",linewidth=2,zorder=0, clip_on=False)
    ax2.axvline(x=x,ymin=0,ymax=1.2,c="red",linewidth=2, zorder=0,clip_on=False)

plt.draw()
fig.savefig('pic.png')

Немного больше работы вы могли бы изменить линиюрисование для обработки общего случая нескольких окон подзаговора, но я глубоко ленивый.: ^)

example of cross-subplot vertical lines

12 голосов
/ 27 мая 2011

Соответствующая документация:
http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.axvline

Редактировать: так как @ ответ DSM был намного лучше моего, я постыдно включил некоторые из этих ответов, пытаясь сделать мой ответ менее бедным.

Я пытался обработать несколько общий случай нескольких вспомогательных участков в столбце (т. Е. Не даже более общий случай нескольких вспомогательных участков, например, в сетке).

Спасибо, @DSM, за ваш ответ и @Artium за вопрос.

import matplotlib.pyplot as plt
import numpy as np

def main():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    cut = (x > 0) & (x % 2 == 0)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y,ls='solid', color=COLORS[i], zorder=1) 
        ax.scatter(x[cut], y[cut], c='r', zorder=2)

        if i != len(yn) - 1:
            ax.set_xticklabels( () )

        for j in x[cut]:
            if i != len(yn) - 1:
                ax.axvline(x=j, ymin=-1.2, ymax=1,
                           c='r', lw=2, zorder=0, clip_on=False)
            else:
                ax.axvline(x=j, ymin=0, ymax=1,
                           c='r', lw=2, zorder=0, clip_on=False)

    fig.suptitle('Matplotlib Vertical Line Example')
    plt.show()

if __name__ == '__main__':
    main()

enter image description here

7 голосов
/ 26 марта 2013

[Обновление 03/2013] В более новых версиях matplotlib есть ConnectionPatch , который значительно упрощает эту задачу. Это особенно полезно, когда нужно охватить более двух участков.

from matplotlib import pyplot as plt
from matplotlib.patches import ConnectionPatch
from numpy import arange, sin, cos

xx = arange(100)
cut = (xx > 0) & (xx % 17 == 0)
y1 = sin(xx)
y2 = (xx**2) % 2.0+cos(xx+0.5)

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(xx, y1, c="blue")
ax1.scatter(xx[cut], y1[cut], c="red")
ax2 = fig.add_subplot(212)
ax2.plot(xx, y2, c="green")
ax2.scatter(xx[cut], y2[cut], c="red")

for x in xx[cut]:
    con = ConnectionPatch(xyA=(x, -1.5), xyB=(x, 1.5),
        coordsA="data", coordsB="data", axesA=ax2, axesB=ax1,
        arrowstyle="-", linewidth=2, color="red")
    ax2.add_artist(con)

plt.draw()
fig.savefig('pic.png')
1 голос
/ 27 мая 2011

Я бы попробовал axvline(x, y1, y2) ( ссылка ), но я не думаю, что какой-либо из параметров в pyplot будет рисовать что-то, что охватывает несколько вспомогательных графиков.

Если это так, я бы просто попытался нарисовать одну и ту же вертикальную линию в каждой точке графика, надеясь, что одно и то же намерение будет передано зрителю.

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