python - 如何绘制 3d 直方图

标签 python pandas matplotlib histogram 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, 0.0],"B": [0.0, 0.0, 0.0, 0.0]})

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

# 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.3, 0.4, 0.5]})

enter image description here

你拥有的商店越多,你拥有的斧头就越多......

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

enter image description here

您可以使用“alpha=”和“color=”等传统参数设置条形样式,但请记住,您有多个列,因此您必须为每个参数提供列表,而不是单个值。

干杯:)

关于python - 如何绘制 3d 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380690/

相关文章:

python - 为什么 powershell 不识别诗歌?

python - 如何从 distutils 二进制发行版中剥离源代码?

python - Pandas ,带有 datetime64 列的数据框,按小时查询

python - Pandas:通过聚合整行得到结果列

python - 绘图窗口不显示 - Tkinter 存在,但未找到头文件。

python - 将属性等于的数组中的对象子数组分组 - Python

python - 在 Python 中插入周期性数据

python - Pandas 分组并根据条件添加列数据

python - 数据编码为字符串时出现 KeyError

python - knitr:python 引擎输出不在 .md 或 .html 中