【问题标题】:How to make 3D bar plot from dataframe如何从数据框制作 3D 条形图
【发布时间】:2020-11-10 21:36:07
【问题描述】:

这就是我的 df 的样子:

hr    slope  value   
8      s_1     6     
10     s_1     2     
8      s_2     4     
10     s_2     8    

我想制作一个 3D 条形图,其中 x 轴为“hr”,y 轴为“value”,z 轴为“slopes”。

xpos = df['hr']
ypos = df['value']
xpos, ypos = np.meshgrid(xpos+0.25, ypos+0.25)
xpos = xpos.flatten()
ypos = ypos.flatten()
zpos=np.zeros(df.shape).flatten()

dx=0.5 * np.ones_like(zpos)
dy=0.5 * np.ones_like(zpos)
dz=df.values.ravel()

ax.bar3d(xpos,ypos,zpos,dx,dy,dz,color='b', alpha=0.5)
plt.show()

我收到以下错误消息:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

非常欢迎任何帮助, 提前谢谢你

【问题讨论】:

    标签: python matplotlib 3d bar-chart


    【解决方案1】:

    bar3d() 的文档可以在https://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.bar3d 找到。 Here 是对它的解释。官方demo可以在https://matplotlib.org/3.1.1/gallery/mplot3d/3d_bars.html找到。

    import matplotlib.pyplot as plt
    
    xpos = [1, 2, 3]  # x coordinates of each bar
    ypos = [0, 0, 0]  # y coordinates of each bar
    zpos = [0, 0, 0]  # z coordinates of each bar
    dx = [0.5, 0.5, 0.5]  # Width of each bar
    dy = [0.5, 0.5, 0.5]  # Depth of each bar
    dz = [5, 4, 7]        # Height of each bar
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    ax.bar3d(xpos,ypos,zpos,dx,dy,dz, color='b', alpha=0.5)
    
    plt.show()
    

    你得到这个错误的问题是xpos, ypos, zpos, dx, dy, dz的长度不一样。此外,dz 的元素包含字符串。

    这是我如何重现您的示例

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('1.csv')
    
    xpos = df['hr']
    ypos = df['value']
    
    xpos, ypos = np.meshgrid(xpos+0.25, ypos+0.25)
    xpos = xpos.flatten()
    ypos = ypos.flatten()
    
    zpos = np.zeros(df.shape).flatten()
    
    dx = 0.5 * np.ones_like(zpos)
    dy = 0.5 * np.ones_like(zpos)
    dz = df[['hr', 'value']].values.ravel()
    
    print(xpos)
    print(ypos)
    print(zpos)
    print(dx)
    print(dy)
    print(dz) # [8 's_1' 6 10 's_1' 2 8 's_2' 4 10 's_2' 8]
    
    print(len(xpos))  # 16
    print(len(ypos))  # 16
    print(len(zpos))  # 12
    print(len(dx))    # 12
    print(len(dy))    # 12
    print(len(dz))    # 12
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    ax.bar3d(xpos,ypos,zpos,dx,dy,dz,color='b', alpha=0.5)
    
    plt.show()
    

    1.csv的内容是

    hr,slope,value
    8,s_1,6
    10,s_1,2
    8,s_2,4
    10,s_2,8
    

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多