【问题标题】:matplotlib: plotting a 2d arraymatplotlib:绘制二维数组
【发布时间】:2017-07-22 09:56:58
【问题描述】:

所以最后一天我一直在兜圈子,希望有人能把我从痛苦中解救出来。

我有一个函数 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)

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

我在评论中给出了一些可能性:

或绘图 3D,或 annotations,或 colormapping the lines, 或者如果您只有非常有限数量的 x 值,请使用不同的 linestyle 每个人。

除此之外,您还可以专门为 x 创建一个新轴。在改编自您的代码的以下 sn-p 中,我将 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)

结果如下:

【讨论】:

  • 感谢链接示例,它们很有帮助!
【解决方案2】:

由于线条或多或少对应于 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')

【讨论】:

    【解决方案3】:
    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()
    

    只需修复标签

    【讨论】:

    • 对不起,我可能应该在原始帖子中提到我不想使用图例,因为我有另一个类似的函数将被绘制在一起并且图例很快就会失控。不过感谢您的回复。
    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多