【问题标题】:How to fix "not enough values to unpack" when trying to plot 3D data as colormesh?尝试将 3D 数据绘制为彩色网格时如何解决“没有足够的值来解包”?
【发布时间】:2021-10-21 00:03:47
【问题描述】:

使用matplotlib,我正在尝试将 3D 数据绘制为 2D 颜色图。每个点都有一个x 和一个y 坐标,以及一个“高度”z。此高度应确定某个 x/y 区域的颜色。

这是我一直在尝试的代码:

import random
import numpy as np
import matplotlib.pyplot as plt

x = []
y = []
z = []
for index in range(100):
    a = random.random()
    b = random.random()
    c = np.exp(-a*a - b*b)
    x.append(a)
    y.append(b)
    z.append(c)

cmap = plt.get_cmap('PiYG')
fig, ax = plt.subplots()
ax.pcolormesh(x, y, z, cmap=cmap)

但它给出了一个错误

ValueError: not enough values to unpack (expected 2, got 1)

也许我在尝试错误的事情?

备注:三个列表 x、y、z 并针对上面的示例进行了计算,但实际上我只有三个带有“随机”数字的列表,我想对其进行可视化。给定 x 和 y,我无法计算 z。

我也可以使用imshow 创建我想要的绘图,但我必须先将原始数据转换为矩阵。也许有一个我可以使用的功能?

【问题讨论】:

  • 仅供参考:彻底回答问题非常耗时。如果您的问题已解决,请通过接受最适合您的需求的解决方案表示感谢。 位于答案左上角的 / 箭头下方。如果出现更好的解决方案,则可以接受新的解决方案。如果您的声望超过 15,您也可以使用 / 箭头对答案的有用性进行投票。 如果解决方案不能回答问题,请发表评论What should I do when someone answers my question?。谢谢

标签: python numpy matplotlib random colors


【解决方案1】:

pcolormesh 可能不是此类问题的选择。 pcolormesh 期望有序单元格边缘作为数据而不是随机数据点。如果你事先知道你的网格,你可以这样做,例如

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0, 1, 51)
# meshgrid makes a 2D grid of points
xx, yy = np.meshgrid(x, x)

z = np.exp(-xx**2 - yy*2)

fig, ax = plt.subplots()
ax.pcolormesh(xx, yy, z, cmap="PiYG")

这会给你

或者,您可以在现有设置中使用tri 函数之一,例如tripcolor

import random
import numpy as np
import matplotlib.pyplot as plt

x = []
y = []
z = []
for index in range(100):
    a = random.random()
    b = random.random()
    c = np.exp(-a*a - b*b)
    x.append(a)
    y.append(b)
    z.append(c)

fig, ax = plt.subplots()
ax.tripcolor(x, y, z, cmap="PiYG")

这会给

请注意,使用np.random 生成数据会更简单

x, y = np.random.random(size=(2, 100))
z = np.exp(-x**2 - y**2)

fig, ax = plt.subplots()
ax.tripcolor(x, y, z, cmap="PiYG")

【讨论】:

  • x,y,z 是随机数据。我只是选择使用random 创建它们,以获得最小的可重现示例。但归根结底,它们只是独立的单个数据点
  • 好的,所以你可以按照我的建议使用tripcolor。或者这对你来说是不可能的?
  • 是的,这是可能的。我只是想确定一下。感谢您的建议
【解决方案2】:

xyz 形状存在问题:它们必须是二维数组(矩阵),但它们是一维的。
为了生成xy 轴,您可以使用:

x = []
y = []
for index in range(100):
    x.append(random.random())
    y.append(random.random())

那么你必须创建一个meshgrid:

X, Y = np.meshgrid(x, y)

最后你可以通过网格计算Z

Z = np.exp(-X**2 - Y**2)

这样,你的代码:

cmap = plt.get_cmap('PiYG')
fig, ax = plt.subplots()
ax.pcolormesh(X, Y, Z, cmap=cmap)

给予:


如果您无法在网格上计算 Z,则不应使用 pcolormesh
一些替代方案可能是:

  • 3D 散点图:

    import random
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = []
    y = []
    z = []
    for index in range(100):
        a = random.random()
        b = random.random()
        c = np.exp(-a*a - b*b)
        x.append(a)
        y.append(b)
        z.append(c)
    
    cmap = plt.get_cmap('PiYG')
    
    fig = plt.figure()
    ax = fig.add_subplot(projection = '3d')
    
    ax.scatter(x, y, z, cmap=cmap)
    
    plt.show()
    

  • 2D 彩色散点图:

    import random
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = []
    y = []
    z = []
    for index in range(100):
        a = random.random()
        b = random.random()
        c = np.exp(-a*a - b*b)
        x.append(a)
        y.append(b)
        z.append(c)
    
    cmap = plt.get_cmap('PiYG')
    
    plt.style.use('seaborn-darkgrid')
    fig, ax = plt.subplots()
    
    ax.scatter(x, y, c = z, cmap=cmap)
    
    plt.show()
    

【讨论】:

  • 不,该解决方案不起作用。在我的示例中,我确实通过函数计算了“z”的值。实际上,我只有想要绘制的 z 值,我无法计算它们。我只有三个带有“随机”数字的列表(它们不是随机的,但无法计算)
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 2021-09-12
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2021-11-28
相关资源
最近更新 更多