gpt4 book ai didi

python - 如何将 pandas 多索引数据框绘制为 3d

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:14 26 4
gpt4 key购买 nike

我有一个像这样分组的数据框 df:

Year    Product Sales
2010 A 111
B 20
C 150
2011 A 10
B 28
C 190
… …

我想在 matplotlib 中将其绘制为 3d 图表,其中 Year 为 x 轴,Sales 在 y- z 轴上的轴和 Productenter image description here

我一直在尝试以下方法:

from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X = dfgrouped['Year']
Y = dfgrouped['Sales']
Z = dfgrouped['Product']
ax.bar(X, Y, Z, color=cs, alpha=0.8)

不幸的是我得到了

"ValueError: incompatible sizes: argument 'height' must be length 7 or scalar"

最佳答案

您可以使用 Pandas 绘制 3D 条形图,如下所示:

设置:

arrays = [[2010, 2010, 2010, 2011, 2011, 2011],['A', 'B', 'C', 'A', 'B', 'C']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['Year', 'Product'])

df = pd.DataFrame({'Sales': [111, 20, 150, 10, 28, 190]}, index=index)
print (df)

Sales
Year Product
2010 A 111
B 20
C 150
2011 A 10
B 28
C 190

数据整理:

import numpy as np
import pandas as pd
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

# Set plotting style
plt.style.use('seaborn-white')

对 Sales 列中出现的相似条目 (get_group) 进行分组并遍历它们,然后将它们附加到一个列表。使用 np.hstack 水平堆叠它构成了 3d 图的 z 维度。

L = []
for i, group in df.groupby(level=1)['Sales']:
L.append(group.values)
z = np.hstack(L).ravel()

让 x 和 y 维度上的标签都采用 Multi-Index Dataframe 各个级别的唯一值。然后 x 和 y 维度采用这些值的范围。

xlabels = df.index.get_level_values('Year').unique()
ylabels = df.index.get_level_values('Product').unique()
x = np.arange(xlabels.shape[0])
y = np.arange(ylabels.shape[0])

使用 np.meshgrid 从坐标向量返回坐标矩阵

x_M, y_M = np.meshgrid(x, y, copy=False)

3-D 绘图:

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')

# Making the intervals in the axes match with their respective entries
ax.w_xaxis.set_ticks(x + 0.5/2.)
ax.w_yaxis.set_ticks(y + 0.5/2.)

# Renaming the ticks as they were before
ax.w_xaxis.set_ticklabels(xlabels)
ax.w_yaxis.set_ticklabels(ylabels)

# Labeling the 3 dimensions
ax.set_xlabel('Year')
ax.set_ylabel('Product')
ax.set_zlabel('Sales')

# Choosing the range of values to be extended in the set colormap
values = np.linspace(0.2, 1., x_M.ravel().shape[0])

# Selecting an appropriate colormap
colors = plt.cm.Spectral(values)
ax.bar3d(x_M.ravel(), y_M.ravel(), z*0, dx=0.5, dy=0.5, dz=z, color=colors)
plt.show()

Image


注意:

如果 groupby 对象不平衡,您仍然可以通过 unstacking 来完成并用 0 填充 Nans,然后按如下方式将其堆叠:

df = df_multi_index.unstack().fillna(0).stack()

其中 df_multi_index.unstack 是您的原始多索引数据帧。

对于添加到 Multi-index Dataframe 的新值,获得了下图:

Image2

关于python - 如何将 pandas 多索引数据框绘制为 3d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com