2015-03-30 58 views
0

所以我有一些數據計算,現在應該可視化。對於每個數據元素,我想放置一個單獨的子圖,以便整個圖形儘可能緊湊。下面是五個元素的例子:計算子圖調整

2x3 subplots for five data elements

這是我想出了一個任意元素的原型數:

import matplotlib.pyplot as plt 
import numpy as np 
import math 

data = ... # some list of pairs of numpy arrays, for x and y axes 
size = len(data) 
cols = math.floor(math.sqrt(size)) 
rows = math.ceil(size/cols) 

f, diags = plt.subplots(rows, cols) 

for (row, col), diag in np.ndenumerate(diags): 
    dataIdx = row * cols + col 
    if dataIdx < size: 
     x = data[dataIdx][0] 
     y = data[dataIdx][1] 
     diag.scatter(x, y) 
     diag.set_title('Regressor {}'.format(dataIdx + 1)) 
    else: # discard empty subplots 
     f.delaxes(diag) 
f.show() 

的簡短說明:緊湊,我試圖調整如果可能,以方矩陣的形式繪製。如果沒有,我爲剩下的圖表添加另一行。然後我迭代圖表,計算數據元素的相應位置並繪製其值。如果沒有找到該圖的數據元素,則表示該圖是最後一行的剩餘部分,可以丟棄。

但是,這是我可能用C++或Java編寫的代碼,問題是,pythonic的方式是什麼?

另外,當迭代數據而不是圖時,最好的解決方案是什麼?我當然可以從元素索引中計算圖的行/列,就像我在初始行/列計算中一樣,但也許有更好的方法來做到這一點...

在此先感謝!

+0

什麼是二次矩陣? – AGS 2015-03-30 20:12:09

+0

Ehm,一個矩形矩陣,我以某種方式設法命名二次... – hoefling 2015-03-30 20:14:06

回答

1

我可能會創建這樣的情節:

size = len(data) 
cols = round(math.sqrt(size)) 
rows = cols 
while rows * cols < size: 
    rows += 1 
f, ax_arr = plt.subplots(rows, cols) 
ax_arr = ax_arr.reshape(-1) 
for i in range(len(ax_arr)): 
    if i >= size: 
     ax_arr[i].axis('off') 
    x = data[i][0] 
    y = data[i][1] 
    ax_arr[i].scatter(x,y) 
+0

重塑斧頭是一個絕妙的主意! – hoefling 2017-01-01 11:03:12