Помогите с тем, чтобы большой сюжет выглядел лучше и понятнее - PullRequest
5 голосов
/ 04 августа 2011

У меня есть участок 28 строк х 2 столбца (это может измениться, на самом деле).Предполагается, что шкала yaxis всех строк 1-го столбца одинакова (это должно работать и для этого 2-го столбца) ....

Все xaxis должны быть одинаковыми.

Что я хочу сделать, это сделать что-то внутри выходного рисунка, который показывает, что такое Yaxis для 1-го и 2-го столбцов и что такое Xaxis для обоих столбцов ... Я также хочу получить метку вверхв 1-й и 2-й колонке (с указанием, что это за данные).

Я также хочу изменить аспект графиков, чтобы их было видно более четко (возможно, увеличение размера аспекта оси Yax и уменьшение размера оси Xaxis).немного).

Подплощадка, которую я хочу, без изменения размера, должна быть примерно такой:

Output Figure

Это может быть что-то другое.Я действительно не знаю, что можно сделать из моего запроса.

Код, который мы использовали для генерации фигуры (без надписей):

def pltconc(conc,self):
t=self.t
idx1=0
conc=conc*1000000


c=len(find( self.ml[:,3]==1 ))

from scipy.stats import scoreatpercentile #To adjust the scales
ymin1 = max([median(scoreatpercentile(conc[:,i,:],0.05)) for i in range(28)])
ymax1 = max([median(scoreatpercentile(conc[:,i,:],99.95)) for i in range(28)])

for idx1 in range(c):
    a=subplot(c,2,2*idx1+1, adjustable='box-forced')
    plt.plot(t,conc[:,idx1,0],color='r')
    plt.plot(t,conc[:,idx1,1],color='b')
    plt.axis('tight')
    xlim(0,max(self.t))
    ylim(ymin1,ymax1)
    frame1 = plt.gca()
    a.set_yticklabels([])
    a.set_xticklabels([])


    ax=subplot(c,2,2*idx1+2, adjustable='box-forced')
    CBV = (conc[:,idx1,2]*100)/(90+conc[:,idx1,2])
    StO2 = (conc[:,idx1,0]*100)/(90+conc[:,idx1,2])
    ymin2 = max(median(scoreatpercentile(CBV,0.05)),median(scoreatpercentile(StO2,0.05)))
    ymax2 = max(median(scoreatpercentile(StO2,99.95)),median(scoreatpercentile(CBV,99.95)))
    plt.plot(t,CBV, color='m')
    plt.plot(t,StO2, color = 'b')
    plt.axis('tight')
    xlim(0,max(self.t))
    ylim(ymin2,ymax2)
    frame1 = plt.gca()
    ax.set_yticklabels([])
    ax.set_xticklabels([])

Большое спасибо запомощь.

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

1 Ответ

3 голосов
/ 07 августа 2011

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

Соотношение сторон вашей фигуры контролируется от figsize kwarg до plt.figure (или plt.subplots, в данном случае).

Остальное вы можете сделать с разумным применением annotate.

Вот пример:

import matplotlib.pyplot as plt
import numpy as np

# Generate the data
data = (np.random.random((20, 2, 2, 1001)) - 0.5).cumsum(axis=-1)

# Set up the figure (the figsize is what's going to control your aspect ratio)
fig, axes = plt.subplots(nrows=20, ncols=2, sharex=True, figsize=(6, 10))
fig.subplots_adjust(wspace=0.1, hspace=0, bottom=0.05)

# Turn off tick labels everywhere
for ax in axes.flat:
    for axis in [ax.xaxis, ax.yaxis]:
        axis.set_ticklabels([])

# Plot the data
color = {(0,0):'red', (0,1):'green', (1,0):'blue', (1,1):'magenta'}
for (i,j), ax in np.ndenumerate(axes):
    for k in range(2):
        ax.plot(data[i,j,k,:], color=color[(j,k)])

# Add stacked titles (and text legends)
titles = [['TITLE:', 'Red: Data X', 'Green: Data Y'],
          ['TITLE:', 'Blue: Data W', 'Magenta: Data Z']]
for i, title in enumerate(titles):
    for text, ypos in zip(title, [35, 20, 5]):
        axes[0,i].annotate(text, xy=(0.05, 1.0), xytext=(0, ypos), va='bottom',
                           xycoords='axes fraction', textcoords='offset points')

# Add arrows on "super-Y" axes
xpos, length = -0.1, 5
axes[12,0].annotate('', xy=(xpos, 0), xytext=(xpos, length), 
        xycoords='axes fraction', textcoords='axes fraction',
        arrowprops=dict(arrowstyle='<|-'))
axes[12,0].annotate('{0} subplots'.format(length), xy=(xpos, length/2.0), 
        xycoords='axes fraction', rotation=90, va='center', ha='right')

# Add arrows on "super-X" axes
ypos, length = -0.7, 1000
axes[-1,0].annotate('', xy=(0, ypos), xytext=(length, ypos),
        xycoords=('data', 'axes fraction'), textcoords=('data', 'axes fraction'),
        arrowprops=dict(arrowstyle='<|-'))
axes[-1,0].annotate('{0} data units'.format(length), xy=(length/2.0, ypos), 
        xytext=(0, 5), xycoords=('data', 'axes fraction'), 
        textcoords='offset points', ha='center', va='bottom')

plt.show()

enter image description here

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