2017-02-08 60 views
3

元件的繪製列表我有numpy的陣列的列表,每個潛在具有不同數量的元件,如:具有不同數量的matplotlib

[array([55]), 
array([54]), 
array([], dtype=float64), 
array([48, 55]),] 

我想繪製這個,其中每個陣列具有指定一個橫座標(x值),如[1,2,3,4],以便繪圖應顯示以下幾點:[[1,55], [2, 54], [4, 48], [4, 55]]。 有沒有一種方法可以用matplotlib做到這一點?或者我怎麼能先用numpy或pandas將數據轉換爲可以繪製的數據?

回答

4

你想要做的是鏈接原始數組,並生成一個新的數組與「abscissas」。連接方式有很多種,其中最有效的方法是使用itertools.chain

import itertools 
from numpy import array 

x = [array([55]), array([54]), array([]), array([48, 55])] 

ys = list(itertools.chain(*x)) 
# this will be [55, 54, 48, 55] 

# generate abscissas 
xs = list(itertools.chain(*[[i+1]*len(x1) for i, x1 in enumerate(x)])) 

現在,您可以輕鬆地與matplotlib剛剛繪製如下

import matplotlib.pyplot as plt 
plt.plot(xs, ys) 
+0

不是真的。我需要將最後兩個元素48和55關聯到同一個abc(同樣的x),在這種情況下4. 4. –

+0

如果你想繪製一條線,我已經改變了上面的代碼。不太清楚你想要繪製什麼,但是上面將會做 –

+2

這是有效的,但爲了得到'xs = [1,2,4,4]',你需要使用'[[i + 1] * len(x1)爲i,x1爲枚舉(x)]'。 (目前,它給出了[0,1,3,3]') – tom

0

x列表:

[plt.plot(np.repeat(i,len(x[i])), x[i],'.') for i in range(len(x))] 
plt.show() 
+0

它不好的做法調用列表'list' – tom

+0

你是對的,它只是爲了這個例子:) –

+0

謝謝,但是我的實際列表非常大,我認爲這麼多次調用'plot'不會有效。 –

0

基於itertools @Alessandro馬里亞尼的回答讓我想到另一種方式來生成一個包含我需要的數據的數組。在某些情況下,它可能更緊湊。也正是基於對itertools.chain

import itertools 
from numpy import array 

y = [array([55]), array([54]), array([]), array([48, 55])] 
x = array([1,2,3,4]) 
d = array(list(itertools.chain(*[itertools.product([t], n) for t, n in zip(x,y)]))) 

d現在是以下數組:

array([[ 1, 55], 
     [ 2, 54], 
     [ 4, 48], 
     [ 4, 55]]) 
1

如果你希望有不同的數據組不同的標記(顏色由matplotlib自動循環):

import numpy as np 
import matplotlib.pyplot as plt 

markers = ['o', #'circle', 
      'v', #'triangle_down', 
      '^', #'triangle_up', 
      '<', #'triangle_left', 
      '>', #'triangle_right', 
      '1', #'tri_down', 
      '2', #'tri_up', 
      '3', #'tri_left', 
      '4', #'tri_right', 
      '8', #'octagon', 
      's', #'square', 
      'p', #'pentagon', 
      'h', #'hexagon1', 
      'H', #'hexagon2', 
      'D', #'diamond', 
      'd', #'thin_diamond' 
      ] 

n_markers = len(markers) 

a = [10.*np.random.random(int(np.random.random()*10)) for i in xrange(n_markers)] 

fig = plt.figure() 
ax = fig.add_subplot(111) 
for i, data in enumerate(a): 
    xs = data.shape[0]*[i,] # makes the abscissas list 
    marker = markers[i % n_markers] # picks a valid marker 
    ax.plot(xs, data, marker, label='data %d, %s'%(i, marker)) 

ax.set_xlim(-1, 1.4*len(a)) 
ax.set_ylim(0, 10) 
ax.legend(loc=None) 
fig.tight_layout() 

Graph with different markers 通知的極限y比例是硬編碼,相應地改變。 1.4*len(a)意味着在圖例右側留下空間。上述

的例子已在x=0沒有點(將深藍色圓圈)作爲其數據集的隨機分配的大小是零,但是你可以很容易地放置+1如果你不想使用x=0

1

用熊貓來創建插入NaN的一個numpy的數組當數組爲空或大於列表中的最長的陣列短...

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

arr_list = [np.array([55]), 
      np.array([54]), 
      np.array([], dtype='float64'), 
      np.array([48, 55]),] 

df = pd.DataFrame(arr_list) 
list_len = len(df) 
repeats = len(list(df)) 
vals = df.values.flatten() 
xax = np.repeat(np.arange(list_len) + 1, repeats) 
df_plot = pd.DataFrame({'xax': xax, 'vals': vals}) 
plt.scatter(df_plot.xax, df_plot.vals); 
相關問題