2012-10-18 79 views
4

我正在繪製兩種不同格式的相同數據:對數刻度和線性刻度。matplotlib subplots具有相同的「設置」

基本上我想有完全一樣的情節,但是不同的尺度,一個在另一個的上面。

我現在所擁有的是這樣的:

import matplotlib.pyplot as plt 

# These are the plot 'settings' 
plt.xlabel('Size') 
plt.ylabel('Time(s)'); 
plt.title('Matrix multiplication') 

plt.xticks(xl, rotation=30, size='small') 
plt.grid(True) 

# Settings are ignored when using two subplots 

plt.subplot(211) 
plt.plot(xl, serial_full, 'r--') 
plt.plot(xl, acc, 'bs') 
plt.plot(xl, cublas, 'g^') 

plt.subplot(212) 
plt.yscale('log') 
plt.plot(xl, serial_full, 'r--') 
plt.plot(xl, acc, 'bs') 
plt.plot(xl, cublas, 'g^') 

所有的 '設置' 以前plt.subplot被忽略。

我可以按照我想要的方式工作,但是我必須在每個子圖聲明後複製所有設置。

有沒有辦法一次配置兩個子圖?

回答

10

plt.*設置通常適用於matplotlib的當前 plot;與plt.subplot,你開始一個新的情節,因此設置不再適用於它。您可以通過與地塊相關聯的Axes對象(see examples here)共享標籤,刻度等,但是恕我直言,這將在這裏矯枉過正。相反,我建議把常見的「造型」成一個函數並調用每情節:

def applyPlotStyle(): 
    plt.xlabel('Size') 
    plt.ylabel('Time(s)'); 
    plt.title('Matrix multiplication') 

    plt.xticks(range(100), rotation=30, size='small') 
    plt.grid(True) 

plt.subplot(211) 
applyPlotStyle() 
plt.plot(xl, serial_full, 'r--') 
plt.plot(xl, acc, 'bs') 
plt.plot(xl, cublas, 'g^') 

plt.subplot(212) 
applyPlotStyle() 
plt.yscale('log') 
plt.plot(xl, serial_full, 'r--') 
plt.plot(xl, acc, 'bs') 
plt.plot(xl, cublas, 'g^') 

在一個側面說明,你可以通過提取你的情節深挖更多的複製命令到這樣的功能:

def applyPlotStyle(): 
    plt.xlabel('Size') 
    plt.ylabel('Time(s)'); 
    plt.title('Matrix multiplication') 

    plt.xticks(range(100), rotation=30, size='small') 
    plt.grid(True) 

def plotSeries(): 
    applyPlotStyle() 
    plt.plot(xl, serial_full, 'r--') 
    plt.plot(xl, acc, 'bs') 
    plt.plot(xl, cublas, 'g^') 

plt.subplot(211) 
plotSeries() 

plt.subplot(212) 
plt.yscale('log') 
plotSeries() 

另一方面說明,將標題置於圖的頂部(而不是每個圖)可能就足夠了,例如使用suptitle

def applyPlotStyle(): 
    plt.ylabel('Time(s)'); 

    plt.xticks(range(100), rotation=30, size='small') 
    plt.grid(True) 

def plotSeries(): 
    applyPlotStyle() 
    plt.plot(xl, serial_full, 'r--') 
    plt.plot(xl, acc, 'bs') 
    plt.plot(xl, cublas, 'g^') 

plt.suptitle('Matrix multiplication') 
plt.subplot(211) 
plotSeries() 

plt.subplot(212) 
plt.yscale('log') 
plt.xlabel('Size') 
plotSeries() 

plt.show() 
3

漢斯的答案很可能是推薦的方法:與之相似,對於xlabel只出現在第二個情節之下可能就足夠了。但是,如果你仍然希望去複製軸屬性到另一個軸,這裏是我發現的方法:

fig = figure() 
ax1 = fig.add_subplot(2,1,1) 
ax1.plot([1,2,3],[4,5,6]) 
title('Test') 
xlabel('LabelX') 
ylabel('Labely') 

ax2 = fig.add_subplot(2,1,2) 
ax2.plot([4,5,6],[7,8,9]) 


for prop in ['title','xlabel','ylabel']: 
    setp(ax2,prop,getp(ax1,prop)) 

show() 
fig.show() 

enter image description here

這使您可以設置白名單,其性質設置,目前我有title,xlabelylabel,但您可以使用getp(ax1)打印出所有可用屬性的列表。

您可以複製使用類似下面的屬性的所有,但我建議反對,因爲一些屬性設置會搞亂了第二個情節。我試圖使用黑名單排除了一些,但你需要與它擺弄得到它的工作:

insp = matplotlib.artist.ArtistInspector(ax1) 
props = insp.properties() 
for key, value in props.iteritems(): 
    if key not in ['position','yticklabels','xticklabels','subplotspec']: 
     try: 
      setp(ax2,key,value) 
     except AttributeError: 
      pass 

(該except/pass是跳過它們gettable屬性,但不可設置)

+1

我編輯你的try塊,以便它不會捕獲任何意外的錯誤。 (該編輯位於審閱隊列中。) – Joooeey

相關問題