带有一些缺失值和许多索引的堆积条形图

Posted

技术标签:

【中文标题】带有一些缺失值和许多索引的堆积条形图【英文标题】:Stacked bar plots with some missing values and many indices 【发布时间】:2021-08-03 12:42:34 【问题描述】:

我有一个海量DataFrame df(按'year'排序):

year       gender
1894       male
1895       male
1895       male
1896       male
1900       male
...
2008       male
2008       female
2009       male
2009       female
2009       female

我的目标是制作一个堆叠条形图,其中 x 轴为 'year',y 轴为这些年份值的出现次数,['gender'] == 'female' 在每个条形的 ['gender'] == 'male' 之上。

我尝试了以下方法:

import plotly.express as px

df['freq'] = df.groupby('year')['gender'].transform('count')

fig = px.bar(df, x="year", y="freq", color='gender')
fig.show()

但是,这会占用过多的运行时间并返回一个空白图表。因此,我没有使用plotly 创建堆积条形图,而是尝试使用matplotlib

import matplotlib.pyplot as plt

df_male = df[df['gender'] == 'male']
df_female = df[df['gender'] == 'female']

X = range(1894, 2010)

plt.bar(X, df_male['year'], color = 'b')
plt.bar(X, df_female['year'], color = 'r', bottom = df_male['year'])
plt.show()

但这会返回ValueError: shape mismatch: objects cannot be broadcast to a single shape,我想知道这是不是因为df 中的1894 年和2009 年之间有一些年份不存在(例如1897、1898、1899 等)。

任何能帮助我更进一步的见解将不胜感激。

【问题讨论】:

df_maledf_female 的大小是多少? @user_na 可能就是这样。它们非常不均匀:df_male 的长度约为 485,000,而 df_female 的长度约为 45,000。但是难道没有办法按照它们每年的频率来堆叠它们吗? 您似乎错过了在过滤后的数组中按年份创建直方图的步骤。您将需要这两个年份列的直方图。见***.com/questions/13129618/… 【参考方案1】:

最简单的解决方案是 seaborn 0.11 的 histplot:

import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame('year': np.random.randint(1894, 2010, 200),
                   'gender': np.random.choice(['male', 'female'], 200))
sns.histplot(data=df, x='year', hue='gender', discrete=True, multiple='stack')

另一种选择是按如下方式创建分组数据框,然后使用 pandas 的绘图:

df.groupby(['year', 'gender']).size().unstack().plot.bar(stacked=True)

这里df.groupby(['year', 'gender']).size() 使用年份和性别作为索引创建了一个系列。 unstack() 将性别索引转换为具有两列的数据框。未堆叠的数据帧也可以发送到 plotly。它看起来像:

gender  female  male
year                
1894       1.0   3.0
1895       1.0   4.0
1896       NaN   1.0
1897       NaN   2.0
....

【讨论】:

以上是关于带有一些缺失值和许多索引的堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

x轴上方和下方计数的堆积条形图?

R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(设置坐标轴为百分比以显示缺失值的比例)

R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式)

R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows)

R语言之缺失值和异常值处理

缺失值(NaN 值)与填充值的重叠图