Python 重塑数据帧并绘制堆叠条形图
我拥有的 我有一个以下样式的框架Python 重塑数据帧并绘制堆叠条形图,python,pandas,Python,Pandas,我拥有的 我有一个以下样式的框架df,其中每一行代表样本发生的故障: index specimen malfunction 1 'first' 'cracked' 2 'first' 'cracked' 3 'first' 'bent' 4 'second' 'bent' 5 'second' 'bent' 6 'second' 'bent' 7 'second' 'cracked'
df
,其中每一行代表样本发生的故障:
index specimen malfunction
1 'first' 'cracked'
2 'first' 'cracked'
3 'first' 'bent'
4 'second' 'bent'
5 'second' 'bent'
6 'second' 'bent'
7 'second' 'cracked'
8 'third' 'cracked'
9 'third' 'broken'
在真实数据集中,我有大约15个不同的样本和大约10种不同类型的故障
我需要什么
我想绘制一个条形图,表示样本发生了多少故障(因此x轴表示样本标签,y轴表示发生故障的数量)。我需要一个堆叠条形图,以便故障必须按颜色分开
我尝试的
我尝试使用seaborn的
catplot(kind='count')
,如果它能够绘制堆叠图表,这正是我所需要的。不幸的是,它不能,而且我无法想出如何重塑我的数据以使用pandas.plot.bar(stacked=True)
将分类数据转换为数字:
import matplotlib.pyplot as plt
df_toPlot = df #another dataframe keep original data in df
df_toPlot['mapMal'] = df_toPlot.malfunction.astype("category").cat.codes
这是df_toPlot的印刷品
index specimen malfunction mapMal
0 1 first cracked 2
1 2 first cracked 2
2 3 first bent 0
3 4 second bent 0
4 5 second bent 0
5 6 second bent 0
6 7 second cracked 2
7 8 third cracked 2
8 9 third broken 1
df_toPlot.groupby(['specimen', 'mapMal']).size().unstack().plot(kind='bar', stacked=True)
plt.show()
第一步是将分类数据转换为数字:
import matplotlib.pyplot as plt
df_toPlot = df #another dataframe keep original data in df
df_toPlot['mapMal'] = df_toPlot.malfunction.astype("category").cat.codes
这是df_toPlot的印刷品
index specimen malfunction mapMal
0 1 first cracked 2
1 2 first cracked 2
2 3 first bent 0
3 4 second bent 0
4 5 second bent 0
5 6 second bent 0
6 7 second cracked 2
7 8 third cracked 2
8 9 third broken 1
df_toPlot.groupby(['specimen', 'mapMal']).size().unstack().plot(kind='bar', stacked=True)
plt.show()
试试这样的方法:
from matplotlib.pyplot import *
import pandas as pd
df = df.groupby(['specimen', 'malfunction']).count().unstack()
这将生成下表:
结果是这个图表:
试试这样的方法:
from matplotlib.pyplot import *
import pandas as pd
df = df.groupby(['specimen', 'malfunction']).count().unstack()
这将生成下表:
结果是这个图表:
谢谢。事实上,我在这里晚了一点才找到这个答案:所以我的问题有点重复。谢谢。事实上,我在这里晚了一点才找到这个答案:所以我的问题有点重复。