【问题标题】:gnuplot linecolor variable in matplotlib?matplotlib中的gnuplot linecolor变量?
【发布时间】:2012-02-15 06:31:13
【问题描述】:

我有一个形成一条线的 y 值数组。此外,我有一个数组,其元素数量与 y 数组的值范围从 0 到 1 相同。我们称这个数组为“z”。我想绘制 y 值数组,以便每个点的颜色与 z 值相对应。

在 gnuplot 中,您可以使用“lc 变量”来执行此操作:

plot ’data’ using 1:2:3 with points lc variable  

使用此处的建议:Matplotlib scatterplot; colour as a function of a third variable ,我可以使用散点图,它确实有效:

import matplotlib as mpl  
import matplotlib.pyplot as plt  

plt.scatter(x, y, c=z, s=1, edgecolors='none', cmap=mpl.cm.jet)  
plt.colorbar()  
plt.show()  

有没有办法用matplotlib中的plot方法做到这一点,类似于这个?

plt.plot(x, y, c=z)

当我尝试上面的代码时,所有的行都是黑色的。

【问题讨论】:

  • 在 gnuplot lc variable 中根据最后一列的值选择线型索引。要将其用作颜色,请使用例如lc palette z.

标签: python plot matplotlib gnuplot


【解决方案1】:

我遇到了同样的问题:想要绘制颜色不均匀的线条,我希望它依赖于第三个变量 (z)。

但我绝对想使用一条线,而不是标记(如@joaquin 的回答)。 我在matplotlib gallery example 中找到了一个解决方案,使用matplotlib.collections.LineCollection 类(链接here)。

这是我的示例,它在 Basemap 中绘制轨迹,并根据其高度对其进行着色:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import LineCollection
import numpy as np

m = Basemap(llcrnrlon=-42,llcrnrlat=0,urcrnrlon=5,urcrnrlat=50, resolution='h')
fig = plt.figure()
m.drawcoastlines()
m.drawcountries()

for i in trajectorias:
    # for each i, the x (longitude), y (latitude) and z (height)
    # are read from a file and stored as numpy arrays

    points = np.array([x, y]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)

    lc = LineCollection(segments, cmap=plt.get_cmap('Spectral'),
                        norm=plt.Normalize(250, 1500))
    lc.set_array(z)
    lc.set_linewidth(2)

    plt.gca().add_collection(lc)

axcb = fig.colorbar(lc)
axcb.set_label('cota (m)')

plt.show()

【讨论】:

  • 如果您希望线段之间的过渡更平滑,您可以改为使用segments = np.concatenate([points[:-2], points[1:-1], points[2:]], axis=1)
  • 我正在尝试绘制一个时间序列,其中垂直轴是粒子的垂直位移,我想使用其他属性(质量)作为颜色图。我收到错误消息:'TypeError: float() 参数必须是字符串或数字,而不是'datetime.datetime'。有什么解决办法吗?
【解决方案2】:

你可以使用分散:

plt.scatter(range(len(y)), y, c=z, cmap=cm.hot)

这里有 ipython -pylab 会话:

In [27]: z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]

In [28]: y = [3, 7, 5, 6, 4, 8, 3, 4, 5, 2, 9]

In [29]: plt.scatter(range(len(y)), y, s=60, c=z, cmap=cm.hot)
Out[29]: <matplotlib.collections.PathCollection at 0x9ec8400>

如果你想使用情节,你可以通过(pycrust session)得到与上面相同的数字:

>>> from matplotlib import pyplot as plt
>>> from matplotlib import cm
>>> y = [3,7,5,6,4,8,3,4,5,2,9]
>>> z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]
>>> for x, (v, c) in enumerate(zip(y,z)):
...      plt.plot(x,v,marker='o', color=cm.hot(c))
...      
[<matplotlib.lines.Line2D object at 0x0000000008C42518>]
[<matplotlib.lines.Line2D object at 0x0000000008C426D8>]
[<matplotlib.lines.Line2D object at 0x0000000008C42B38>]
[<matplotlib.lines.Line2D object at 0x0000000008C452B0>]
[<matplotlib.lines.Line2D object at 0x0000000008C45438>]
[<matplotlib.lines.Line2D object at 0x0000000008C45898>]
[<matplotlib.lines.Line2D object at 0x0000000008C45CF8>]
[<matplotlib.lines.Line2D object at 0x0000000008C48198>]
[<matplotlib.lines.Line2D object at 0x0000000008C485F8>]
[<matplotlib.lines.Line2D object at 0x0000000008C48A58>]
[<matplotlib.lines.Line2D object at 0x0000000008C4B1D0>]
>>> plt.show()
>>> 

【讨论】:

  • 谢谢华金。我决定使用 scatter 而不是 plot。
猜你喜欢
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多