如何在ggplot2中按男性吸烟率对分填充条形图排序
按男性吸烟率降序排列Y轴国家的调整方案
核心操作逻辑
要实现Y轴国家按男性吸烟率从高到低排序,核心是先对数据集按男性吸烟率列做降序排序,再基于排序后的数据集绘制图表,替换掉原来按男女吸烟率总和排序的逻辑。
代码调整示例(Pandas+Matplotlib)
假设你的数据存储在名为df的DataFrame中,包含国家、男性吸烟率、女性吸烟率三列:
# 1. 按男性吸烟率降序排序数据集 df_sorted = df.sort_values(by='男性吸烟率', ascending=False) # 2. 基于排序后的数据绘制条形图 import matplotlib.pyplot as plt bar_width = 0.35 x_index = range(len(df_sorted)) # 绘制男女吸烟率的分组条形 plt.bar(x_index, df_sorted['男性吸烟率'], width=bar_width, label='男性') plt.bar([i + bar_width for i in x_index], df_sorted['女性吸烟率'], width=bar_width, label='女性') # 设置Y轴标签为排序后的国家列表 plt.yticks([i + bar_width/2 for i in x_index], df_sorted['国家']) plt.xlabel('吸烟率') plt.ylabel('国家') plt.title('各国男女吸烟率(按男性吸烟率降序)') plt.legend() plt.show()
Seaborn横向条形图简化写法
如果用Seaborn绘制横向叠加条形图,直接指定排序后的国家顺序即可:
import seaborn as sns # 先完成数据排序 df_sorted = df.sort_values(by='男性吸烟率', ascending=False) # 绘制叠加的横向条形 sns.barplot(data=df_sorted, x='男性吸烟率', y='国家', orient='h', color='#1f77b4', label='男性') sns.barplot(data=df_sorted, x='女性吸烟率', y='国家', orient='h', color='#ff7f0e', label='女性', left=df_sorted['男性吸烟率']) plt.legend() plt.show()
关键注意点
- 确认排序时指定的列名是
男性吸烟率(和你的数据集列名保持一致),不要选错列; - 删掉或替换原代码中按男女吸烟率总和排序的逻辑(比如
df.sort_values(by='总和', ...)这类代码)。
内容的提问来源于stack exchange,提问作者Gideon Parry
相关产品推荐
相关产品推荐

