2017-02-16 10 views
1

Так что я последний раз обходил кругами этот последний день и надеялся, что кто-то может вывести меня из моих страданий.matplotlib: построение 2-мерного массива

У меня есть функция 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 lines] (http://stackoverflow.com/questions/8945699/gnuplot- linecolor-variable-in-matplotlib/18516488 # 18516488), или если у вас есть только очень ограниченное число значений x, используйте другой [linstyle] (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

Я дал несколько возможностей в мой комментарий:

Или Plotting в 3D или annotations или colormapping the lines, или если у вас есть только очень ограниченное число значений x, использующих разные linestyle для каждого.

Кроме этого вы можете создать новую ось специально для х. В следующем фрагменте, адаптированной из кода я поставил значение х в верхней горизонтальной оси:

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

 Смежные вопросы

  • Нет связанных вопросов^_^