matplotlib, добавьте общие горизонтальные линии по оси x для нескольких подграфиков

Мой план состоит в том, чтобы иметь 4 спецификации сетки GridSpec(4,1) для создания сетки 4x4 подграфиков. Я хотел бы добавить горизонтальную линию по осям x каждой строки из 4 участков. Я посмотрел на matplotlib.lines.Line2D, но не смог понять. Какие-либо предложения? Я пытаюсь визуально упростить картинку, чтобы она не выглядела как 16 отдельных графиков.

На картинке ниже у меня есть только первые 2 сетки, но я надеюсь, что она дает лучшее представление о том, чего я надеюсь достичь.

Спасибо! Ваше здоровье

Код (графическая часть):

#---the graph---
fig = plt.figure(facecolor='white')

gs1 = GridSpec(4,1)
gs1.update(left = 0.15, right = .3375 , wspace=0.02)

ax1 = plt.subplot(gs1[3,0])
ax2 = plt.subplot(gs1[2,0])
ax3 = plt.subplot(gs1[1,0])
ax4 = plt.subplot(gs1[0,0])



gs2 = GridSpec(4,1)
gs2.update(left = 0.3875, right = .575, wspace=.25)

ax1 = plt.subplot(gs2[3,0])
ax2 = plt.subplot(gs2[2,0])
ax3 = plt.subplot(gs2[1,0])
ax4 = plt.subplot(gs2[0,0])


show()

введите здесь описание изображения


person As3adTintin    schedule 01.05.2014    source источник
comment
Можете ли вы опубликовать существующий код?   -  person YXD    schedule 01.05.2014
comment
@MrE конечно, я надеюсь, что это не слишком неорганизованно   -  person As3adTintin    schedule 01.05.2014
comment
Этот помогает? stackoverflow.com/questions/22840621/, см. строку с комментариями: '# the вышеуказанные три строки, чтобы нарисовать линию из коробки.'   -  person CT Zhu    schedule 01.05.2014
comment
@CTZhu Я чувствую, что ответ, который я ищу, находится там, но я не могу понять его. основываясь на комментариях в коде, я сосредоточился на разделе ll = plt.plot(xb,yb, '-b') ll[0].set_clip_on(False) plt.axis([0,100,0,1.2])... однако я все еще довольно потерян. Это та часть, на которую нужно смотреть?   -  person As3adTintin    schedule 01.05.2014
comment
Здесь намного слишком много кода. Сократите его до минимального примера, демонстрирующего вашу проблему.   -  person tacaswell    schedule 01.05.2014
comment
Мои извинения. @tcaswell, я отредактировал свой первоначальный пост и надеюсь, что он стал лучше   -  person As3adTintin    schedule 02.05.2014
comment
Можете ли вы нарисовать линию, чтобы показать, где вы хотите, чтобы она была? Потому что ваши оси Y имеют разный масштаб.   -  person CT Zhu    schedule 02.05.2014
comment
@CTZhu Я надеюсь применить четыре линии, по одной на оси X (x = 0). Имеет ли это смысл, или я должен нарисовать один?   -  person As3adTintin    schedule 02.05.2014
comment
Например, при 0 между C8 и I1 на двух нижних графиках и для каждой пары графиков выше этих   -  person As3adTintin    schedule 02.05.2014


Ответы (1)


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

Также ваши 8 графиков могут быть построены во вложенном цикле, что улучшит организацию кода и упростит реализацию этой «общей линии через подзаголовок»:

X=[1,3,4,5]
Y=[3,4,1,3]
L=['A', 'B', 'C', 'D']
f=plt.figure(figsize=(10,16), dpi=100)
gs1 = gridspec.GridSpec(4,1)
gs1.update(left = 0.15, right = .3375 , wspace=0.02)
gs2 = gridspec.GridSpec(4,1)
gs2.update(left = 0.3875, right = .575, wspace=.25)
sp1 = [plt.subplot(gs1[i,0]) for i in range(4)]
sp2 = [plt.subplot(gs2[i,0]) for i in range(4)]
for sp in [sp1, sp2]:
    for ax in sp:
        ax.bar(range(len(L)), X, 0.35, color='r')
        ax.bar(np.arange(len(L))+0.35, Y, 0.35)
        ax.spines['right'].set_visible(False)
        ax.yaxis.set_ticks_position('left')
        ax.spines['top'].set_visible(False)
        ax.xaxis.set_ticks_position('bottom')
        if sp==sp1:
            ax.axis(list(ax.get_xlim())+list(ax.get_ylim())) #set the axis view limit
            ll=ax.plot((0,10), (0,0), '-r') #Let's plot it in red to show it better
            ll[0].set_clip_on(False) #Allow the line to extend beyond the axis view
plt.savefig('temp.png')            

введите здесь описание изображения

person CT Zhu    schedule 02.05.2014
comment
Спасибо! Это именно то, что я искал. К сожалению, я не думаю, что смогу использовать вложенный цикл, потому что я хочу, чтобы метки xticklabels отображались только для нижних графиков. - person As3adTintin; 02.05.2014
comment
Если бы я был на вашем месте, я бы сделал x тактов невидимыми для каждого подзаголовка во вложенном цикле. Затем сделайте отметки x отдельно для sp1[-1] и sp2[-1]. - person CT Zhu; 03.05.2014
comment
как мне сделать тики отдельно для sp1[-1]? - person As3adTintin; 22.05.2014