基于欧洲男性身高数据创建带排名的有序直方图(ggplot实现)
解决欧洲国家男性身高柱状图的需求
原始数据集
| 国家 | 身高(cm) |
|---|---|
| UK | 176 |
| Ireland | 175 |
| Cyprus | 174 |
| Belgium | 179 |
| Netherlands | 180 |
| Sweden | 178 |
| Norway | 181 |
| Spain | 173 |
| Italy | 171 |
| France | 177 |
你当前用geom_line()绘制的是折线图,不符合直方图(分类数据对应数值应使用柱状图)的需求,同时缺少国家排序和排名计算的步骤。以下是完整解决方案:
步骤1:数据预处理
先对数据按国家字母排序,再计算身高排名(身高越高排名越靠前),使用dplyr包处理:
library(dplyr) library(ggplot2) # 假设你的数据框名为data,先排序再计算排名 data_processed <- data %>% arrange(Country) %>% # 按国家名称字母顺序排序 mutate(Rank = dense_rank(desc(Height))) # 按身高降序算排名,dense_rank处理并列情况
步骤2:绘制符合要求的柱状图
用ggplot2生成柱状图,在柱子上方添加排名标签:
ggplot(data_processed, aes(x = Country, y = Height)) + geom_col(fill = "#2c3e50") + # 绘制柱状图,设置柱子填充色 geom_text(aes(label = paste("排名:", Rank)), vjust = -0.5, # 把文本定位到柱子顶端上方 size = 3.5) + labs(title = "欧洲10国男性身高分布(按国家字母排序)", x = "国家", y = "男性身高(cm)") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
关键说明
arrange(Country):确保x轴国家按字母顺序排列dense_rank(desc(Height)):按身高从高到低计算排名,若需要跳过并列排名的位置,可替换为rank(desc(Height))geom_col():替代geom_line(),适合展示分类数据对应的数值geom_text():在每个柱子上方添加排名标签,vjust参数调整文本垂直位置
内容的提问来源于stack exchange,提问作者user20370286
相关产品推荐
相关产品推荐

