matplotlib:如何绘制3d直方图

问题描述

我有一个如下数据框:

      date         shop    success
1     12/06/2020   A       0.99
2     15/06/2020   A       0.95
3     17/07/2020   B       0.94
4     22/07/2020   B       0.97
...

我想绘制类似于这种类型的3d直方图:

example 3d hist

这三个维度是:

  • x:日期
  • y:商店
  • z:成功

我浏览了许多网站,但找不到解决方法。我对编程很陌生。

感谢您的帮助!

解决方法

简短答案:可以,但是您必须修改DataFrame结构。

详细答案:

必要的库:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

数据框中的“日期”和“商店”列不是数值。这意味着,您必须在没有它们的情况下构造图形,然后使用它们在轴上标记刻度线。因此,让冷杉缩小空图。这是您需要的数据框结构。

df = pd.DataFrame({"A": [0.0,0.0,0.0],"B": [0.0,0.0]})

您需要按“商店”对所有值进行分组,并使用主变量“商店”!

# Setting length and wight of the bars
dx,dy = .9,.01

# prepare 3d axes
fig = plt.figure(figsize=(6,6))
ax = Axes3D(fig)

# set bar positions on axes
xpos=np.arange(df.shape[0])
ypos=np.arange(df.shape[1])

# set the ticks in the middle of the bars
ax.set_xticks(xpos + dx/2)
ax.set_yticks(ypos + dy/2)

# create X,Y grid 
xpos,ypos = np.meshgrid(xpos,ypos)
xpos = xpos.flatten()
ypos = ypos.flatten()

# set the start of the bar to 0
zpos=np.zeros(df.shape).flatten()

# the bar heights these are the values under the column A and B
dz = df.values.ravel()

# ploting the barchart
ax.bar3d(xpos,ypos,zpos,dx,dy,dz)

# Labeling the ticks. For simplicity's sake I used lists for labeling but you can also iterate through columns "Date" and "Shop" to get the label values
ax.w_yaxis.set_ticklabels(["A","B"])
ax.w_xaxis.set_ticklabels(["12/06/2020","15/06/2020","17/07/2020","22/07/2020" ])

# Label the axes
ax.set_xlabel("Date")
ax.set_ylabel("Shop")
ax.set_zlabel("Success")

plt.show()

输出:

enter image description here

完美!如您所见,我们的基地在一个轴上有A和B商店,在另一个轴上有日期。现在,我们可以将一些数据输入到原始DataFrame中,并定义“成功” Z值。

df = pd.DataFrame({"a": [0.1,0.2,0.3,0.4],"b": [0.2,0.4,0.5]})

enter image description here

拥有更多商店的斧头越多...

df = pd.DataFrame({"a": [0.1,0.5],"c": [0.1,1.4]})

enter image description here

您可以使用诸如“ alpha =”和“ color =”之类的传统参数来设置条形,但请记住,您有几列,因此必须为每个参数提供列表,而不是单个值。

干杯:)