2016-08-25 82 views
0

如果我有,例如,這些數據集3繪製:如何獲得matplotlib中的子圖的長度不同但長度相同的座標軸?

a = np.arange(0,10,1) 
b = np.arange(2,6,1) 
c = np.arange(5,10,1) 

,顯然,我不想讓他們共享同一軸線上,因爲他們中有些人基本上只是有一個大的空圖在角落的某個地方放了幾個數據點。所以我理想地會有不同大小的小區,但都具有相同的尺度(即,步驟1在所有小區中具有相同的長度)。我知道我可以通過設置圖形的大小來手動執行此操作,但是對於大量的數據集或者不是很好的數字,這將是一個真正的痛苦。但是通過其他問題或文檔搜索,我找不到任何可能的東西,例如,設置座標軸上固定的距離或其他東西。請注意,我沒有詢問寬高比。縱橫比可以不同,我只需要一個軸上的相同比例。 (請參閱下面的圖片,這有望說明我的問題。注意:不,我不需要在我的實際情節中使用比例尺,這裏是爲了讓您瞭解比例是如何變化的。) 謝謝。

updated image

+0

將軸('縮放')做這項工作嗎?它應該如何實施? – durbachit

+0

http://stackoverflow.com/a/30266598/3826323有幫助嗎? – Daniele

回答

0

經過大量研究,看起來確實沒有任何簡單的命令來做到這一點。但首先,考慮每個子圖的x和y值的範圍及其比率和佈局,GridSpec將完成這項工作。

因此,對於我們的示例,佈局如問題中所示,即最上面的圖片,兩個較小的圖片緊挨着下方。爲了更容易,y範圍對於所有這些都是相同的(但是如果不是,我們將使用與x相同的計算)。現在,知道這個佈局,我們可以創建一個網格。垂直跨度爲20(因爲我們有兩行4個圖,y範圍爲10),我們可能需要在它們之間爲軸標籤,圖例等添加一些空間,所以我們將添加額外的5.第一個圖的x範圍10,然而,第二和第三個數字的範圍是4和5,總共是9,我們可能還需要一些空間,所以讓我們再加3個額外的。因此,我們創建一個25 x 12的網格,並按照以下方式將我們的網格繪製在這個網格中:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import gridspec 

## GRIDSPEC INTRO - creating a grid to distribute the subplots with same scales and different sizes. 
fig = plt.figure() 
gs=gridspec.GridSpec(25,12) 
## SUBPLOTS of GRIDSPEC 
#the first (big) plot 
axes1 = plt.subplot(gs[:10,:10]) 
ax1 = plt.plot(x,y) # plot some data here 
ax1 = plt.xlim(1,10) 
ax1 = plt.ylim(1,10) 
# the second plot below the big one on the left 
axes2 = plt.subplot(gs[15:,:4]) 
ax2 = plt.plot(x,y) # plot some data here 
ax2 = plt.xlim(2,6) 
ax2 = plt.ylim(1,10) 
# the third plot - below the big one on the right 
axes3 = plt.subplot(gs[15:,7:]) 
ax3 = plt.plot(x,y) # plot some data here 
ax3 = plt.xlim(5,10) 
ax3 = plt.ylim(1,10) 
plt.show() 
0

小時後嘛:

__author__ = 'madevelasco' 

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 


def group(x, max, min, iters): 
    total_range = max - min 
    for i in range(0, iters): 
     if (x > min + i*total_range/iters and x <= min + (i+1)*total_range/iters): 
      return i 



def newPlots(): 
    df = pd.DataFrame(np.random.randn(100, 2), columns=['x', 'y']) 
    df.plot(x = 'x', y = 'y', kind = 'scatter', alpha=0.5) 
    plt.show() 

    ##Sort by the column you want 
    df.sort_values(['x'], ascending=[False], inplace=True) 
    result = df.reset_index(drop=True).copy() 

    #Number of groups you want 
    iterations = 3 
    max_range = df['x'].max() 
    min_range = df['x'].min() 
    total_range = max_range - min_range 

    result['group'] = result.apply(lambda x: group(x['x'], max_range, min_range, iterations), axis=1) 
    print(result) 

    for x in range (0, iterations): 

     lower = min_range + (x)*total_range/iterations 
     upper = min_range + (1+x)*total_range/iterations 
     new = result[result['group'] == x] 
     new.plot(x = 'x', y = 'y', kind = 'scatter', alpha=0.3) 
     axes = plt.gca() 
     axes.set_xlim([lower, upper]) 
     axes.set_ylim([df['y'].min(),df['y'].max()]) 
     plt.show() 

if __name__ == '__main__': 
    newPlots() 

我用熊貓來了這一點。老實說,可視化的想法是將所有數據都放在一個圖中,但不能像這樣分開。爲了保持你的日期的想法,甚至爲了可讀性,其中一個軸應該是固定的。我的編輯之間沒有

所有點的圖像

General

子地塊

first subplot

second subplot

third subplot

+0

這些座標軸的長度都是相同的,並且共享同一個x軸,但是我不共享任何東西並且長度不同。我只是希望單元在所有軸上都相同。所以基本上在1-10的這個範圍內,我希望「1」長1釐米,因此「a」的軸爲10釐米長,「b」的軸爲4釐米長,軸爲「c 「長5釐米。 (查看更新的問題。)謝謝 – durbachit

+0

答案和圖像更新 –

+0

仍然不是我所要求的。查看我更新的問題中的圖片。 (對於每個子圖,xlim和ylim是不同的,所以顯然我可以改變他們每個的極限,但是當我這樣做時,每個圖的比例是不同的,這就是我正在努力的) – durbachit