如何将pandas multiindex数据框绘制为3d

时间:2016-08-24 13:59:41

标签: python pandas matplotlib 3d seaborn

我的数据框df分组如下:

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

我希望在matplotlib中将其绘制为3d图表,其中Year为x轴,Sales为y轴,Product为z轴。 enter 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:不兼容的大小:参数'height'必须是长度7或   标量“

1 个答案:

答案 0 :(得分:4)

您可以使用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')

对“销售”列中的相似条目( get_group )进行分组,并对其进行迭代,然后将其附加到list。这会使用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维度上的标签都采用多索引数据帧各自级别的唯一值。然后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)

三维绘图:

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执行此操作 并将Nans填入0&#39;然后将stacking填回如下:

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

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

对于添加到多索引数据帧的新值,将获得以下绘图:

Image2