2017-02-16 236 views
1

所以我一直轉圈圈在這最後一天了,希望有人可以把我趕出痛苦。matplotlib:繪製二維數組

我有一個函數f依賴於x和y的值,並在繪圖˚F對Y,給出了以下figure

現在每行的是對於x [0,1]的值和感覺,必須有一種方法來顏色/輪廓繪圖,使得其可以很容易地鑑定出的線對應於x的什麼值。我嘗試了大量搜索,但在這種情況下沒有找到任何有用的幫助。

的代碼重現,讓我的身材是如下數據。任何幫助都會很棒,因爲我覺得我錯過了一些顯而易見的東西。

import numpy as np 
import matplotlib.pyplot as plt 

y = np.linspace(0,100) 
x = np.linspace(0,1,11) 

f = np.zeros((len(y), len(x))) 


for j in range(len(x)): 
    i=0 
    for r in y: 
     f[i,j] = (1000 + (-r * 2)) + (1000*(1-x[j])) 
     i += 1 

plt.plot(f, y) 
+1

怎麼樣一個[傳奇](http://matplotlib.org/users/legend_guide.html)? – MKesper

+0

http://stackoverflow.com/questions/16992038/inline-labels-in-matplotlib和http://matplotlib.org/users/legend_guide.html – Dadep

+0

或者標繪在[3D](http://matplotlib.org/ mpl_toolkits/mplot3d/tutorial.html),或[註釋](http://matplotlib.org/users/annotations_intro.html),或[colormapping線(http://stackoverflow.com/questions/8945699/gnuplot- linecolor-variable-in-matplotlib/18516488#18516488),或者如果只有非常有限的x個值,請使用不同的[linestyle](http://matplotlib.org/api/lines_api.html#matplotlib.lines。 Line2D.set_linestyle)。 – armatita

回答

0
import numpy as np 
import matplotlib.pyplot as plt 

y = np.linspace(0, 100) 
x = np.linspace(0, 1, 11) 
f = np.zeros((len(y), len(x))) 

for j in range(len(x)): 
    i = 0 
    for r in y: 
     f[i, j] = (1000 + (-r * 2)) + (1000 * (1 - x[j])) 
     i += 1 

plt.plot(f, y) 
labels = [f[xs, 0] for xs in x] 
plt.legend(labels, loc='best') 
plt.show() 

剛剛修復標籤

+0

對不起,我可能應該在原文中提到我不想使用圖例,因爲我有另一個類似的功能,它們可以一起繪製,並且圖例很快就會失控。謝謝你的迴應。 – Matthew

0

我給我的評論幾種可能性:

或者是策劃在 3D,或 annotations,或 colormapping the lines, 或者你只有非常有限的x值使用不同的 linestyle 每個。

除此之外,您可以創建專門用於x的新軸。在適於從以下代碼段我把X值在頂部水平軸:

import numpy as np 
import matplotlib.pyplot as plt 

y = np.linspace(0,100) 
x = np.linspace(0,1,11) 

f = np.zeros((len(y), len(x))) 


for j in range(len(x)): 
    i=0 
    for r in y: 
     f[i,j] = (1000 + (-r * 2)) + (1000*(1-x[j])) 
     i += 1 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twiny() 
ax2.set_xticks(x) 
ax2.set_xticklabels(["%.3f" % xi for xi in x]) 
ax1.plot(f, y) 

結果如下:

Double x axis

+0

感謝鏈接的例子,它們非常有幫助! – Matthew

0

由於線對應於多個或不太連續的x值,我會根據色彩圖對線進行着色。 然後使用colorbar來顯示x到顏色的映射。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cmx 
import matplotlib.colors as colors 

y = np.linspace(0,100) 
x = np.linspace(0,1,11) 

f = np.zeros((len(y), len(x))) 


for j in range(len(x)): 
    i=0 
    for r in y: 
     f[i,j] = (1000 + (-r * 2)) + (1000*(1-x[j])) 
     i += 1 


cn = colors.Normalize(vmin=0, vmax=1) 
scalar_map = cmx.ScalarMappable(norm=cn, cmap='jet') 
# see plt.colormaps() for many more colormaps 

for f_, x_ in zip(f.T, x): 
    c = scalar_map.to_rgba(x_) 
    plt.plot(f_, y, color=c) 

scalar_map.set_array([]) # dunno why we need this. plt.colorbar fails otherwise. 
plt.colorbar(scalar_map, label='x') 

enter image description here

+0

這正是我想要的,謝謝你! – Matthew