我想用seaborn(matplotlib也很好)从我的DataFrame创建一个barplot。
但是从文档来看,barplot function需要一个看起来像这样的值列表:
然后您可以使用以下方式进行绘制:
tips = sns.load_dataset("tips")
sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
我的数据看起来不一样,我在各列中创建了一个multi_index。由于我无法发布原始数据,因此以下是有关如何查找提示数据集的模型:
下面是创建上述数据框的代码:
index_tuples=[]
for sex in ["Male", "Female"]:
for day in ["Sun", "Mon"]:
index_tuples.append([sex, day])
index = pd.MultiIndex.from_tuples(index_tuples, names=["sex", "day"])
dataframe = pd.DataFrame(columns = index)
total_bill = {"Male":{"Sun":5, "Mon":3},"Female":{"Sun":10, "Mon":5}}
dataframe = dataframe.append(pd.DataFrame.from_dict(total_bill).unstack().rename('total_bill'))
现在,我的问题是:如何从该多索引创建条形图?
该解决方案应正确地对条进行分组,就像hue
参数的seaborn一样。简单地将数据作为数组获取并将其传递给matplotlib是行不通的。
到目前为止,我的解决方案是通过重复堆叠DataFrame将多索引转换为列。像这样:
stacked_frame = dataframe.stack().stack().to_frame().reset_index()
这将导致seaborn期望的数据布局:
您可以使用
进行绘制sns.barplot(x="day", y=0, hue="sex", data=stacked_frame)
plt.show()
我可以直接从多重索引创建条形图吗?