R中柱状图的图例

编程语言 2026-07-12

我正在用R 做一个相对简单的条形图,数据如下:

# A tibble: 4 × 2
  housing_density  HOW_MANY
            <int>     <int>
1               1 276360784
2               2   9233474
3               3  11659386
4               4   1905698

我已经用这段代码创建了如下的条形图:

ggplot(data = sub_21_24_df) +
  geom_bar(mapping = aes(x = housing_density, y = HOW_MANY, fill = housing_density), stat = "identity")

当前条形图

然而,表示Housing Density的 y轴数值对应的是描述性标签,而我希望在图例中体现这些标签。比如:1=农村,2=农村/郊区,3=郊区,4=城市。因此我并不需要图例显示1-4,而是用颜色编码的描述标签会更有帮助。

有没有办法手动实现?还是需要在tibble/数据框中更改名称以使图例反映这些描述?

解决方案

一个安全的选项是先把 housing_density 变成一个 factor,这在绘图时可以避免手动处理中的拼写错误。

sub_21_24_df$housing_density <- 
  factor(sub_21_24_df$housing_density, 
         labels=c('rural', 'rural/suburb', 'suburb',  'city')
  )

这将得到:

> sub_21_24_df
  housing_density  HOW_MANY
1           rural 276360784
2    rural/suburb   9233474
3          suburb  11659386
4            city   1905698

在分配因子标签时要小心,因为它们是按照数值的字母顺序来分配的,而不是它们在列中出现的顺序,参见:

> (x <- c(4, 3, 1, 2))
[1] 4 3 1 2
> factor(x, labels=c('rural', 'rural/suburb', 'suburb',  'city'))
[1] city         suburb       rural        rural/suburb
Levels: rural rural/suburb suburb city

然后再考虑可视化实际需要多少复杂性。我真的需要一个图例吗,还是可以把标签直接显示在条形下方?我真的需要不同的颜色吗,还是条形本身已经足够清晰地区分?在这里,使用 barplot 的极简解决方案:

png('myplot.png')
barplot(
  sub_21_24_df$HOW_MANY/1e6, 
  col='black', 
  las=1,  ## makes y-axis labels horizontal
  ylab='Density (in millions)',
  names.arg=sub_21_24_df$housing_density
)
dev.off()

在此处输入图片描述

由于问题明确是关于图例的,你可以使用以下方式添加一个图例:

png('myplot_legend.png')
barplot(
  sub_21_24_df$HOW_MANY/1e6, 
  col=2:5, 
  las=1,  ## makes y-axis labels horizontal
  ylab='Density (in millions)',
  names.arg=as.integer(sub_21_24_df$housing_density),
  legend.text=sub_21_24_df$housing_density
)
dev.off()

在此处输入图片描述

如有需要,这在 ggplot2 中也应以类似方式工作,我就留给你来决定。


数据:

sub_21_24_df <- read.table(text='  housing_density  HOW_MANY
1               1 276360784
2               2   9233474
3               3  11659386
4               4   1905698')
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章