《R数据可视化手册》一3.9 添加数据标签

简介:

本节书摘来自异步社区《R数据可视化手册》一书中的第3章,第3.9节,作者 【美】Winston Chang,更多章节内容可以访问云栖社区“异步社区”公众号查看

3.9 添加数据标签

问题
如何给条形图添加数据标签?

方法
在绘图命令中加上geom_text()即可为条形图添加数据标签。运行命令时,需要分别指定一个变量映射给x、y和标签本身。通过设定vjust(竖直调整数据标签位置)可以将标签位置移动至条形图顶端的上方或者下方,如图3-22所示。

library(gcookbook) # 为了使用数据

# 在条形图顶端下方
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) +
   geom_bar(stat="identity") +
   geom_text(aes(label=Weight), vjust=1.5, colour="white")

# 在条形图顶端上方
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) +
  geom_bar(stat="identity") +
  geom_text(aes(label=Weight), vjust=-0.2)


332e7ee9809c3a7ead1cd66be8961a82cdc22030

注意,当数据标签被置于条形图顶端时,它们可能会被遮挡。为了避免这个问题,可以参见8.2节的内容。

讨论
在图3-22中,数据标签的y轴坐标位于每个条形的顶端中心位置;通过设定竖直调整(vjust)可以将数据标签置于条形图顶端的上方或者下方。这种做法的不足之处在于当数据标签被置于条形图顶端上方时有可能使数据标签溢出绘图区域。为了修正这个问题,我们可以手动设定y轴的范围,也可以保持竖直调整不变,而令数据标签的y轴坐标高于条形图顶端。后一种办法的不足之处在于,当你想将数据标签完全置于条形图顶端上方或者下方的时候,竖直方向调整的幅度依赖于y轴的数据范围;而更改vjust时,数据标签离条形顶端的距离会根据条形图的高度自动进行调整。

# 将y轴上限变大
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) +
  geom_bar(stat="identity") +
  geom_text(aes(label="Weight"), vjust=-0.2) +
  ylim(0, max(cabbage_exp$Weight)*1.05)

# 设定标签的y轴位置使其略高于条形图顶端——y轴范围会自动调整
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) +
  geom_bar(stat="identity") +
  geom_text(aes(y=Weight+0.1, label=Weight))

对于簇状条形图,需要设定position=position_dodge()并给其一个参数来设定分类间距。分类间距的默认值是0.9,因为簇状条形图的条形更窄,所以,需要使用字号(size)来缩小数据标签的字体大小以匹配条形宽度。数据标签的默认字号是5,这里我们将字号设定为3使其看起来更小(见图3-23)。

ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +
  geom_bar(stat="identity", position="dodge") +
  geom_text(aes(label=Weight), vjust=1.5, colour="white",
        position=position_dodge(.9), size=3)


3344b446f9aff9ce469ff1baac2bdf5bde3c2526

向堆积条形图添加数据标签之前,要先对每组条形对应的数据进行累积求和。在进行本操作之前,须保证数据的合理排序,否则,可能计算出错误的累积和。我们可以用plyr包中的arrange()函数完成上述操作,plyr包是一个随ggplot2包加载的软件包。

library(plyr)
# 根据日期和性别对数据进行排序
ce <- arrange(cabbage_exp, Date, Cultivar)

确认数据合理排序之后,我们可以借助ddply()函数以Date为分组变量对数据进行分组,并分别计算每组数据对应的变量Weight的累积和。

# 计算累积和
ce <- ddply(ce, "Date", transform, label_y=cumsum(Weight))
ce

Cultivar Date Weight    sd n     se percent_weight label_y
   c39 d16  3.18 0.9566144 10 0.30250803    58.45588  3.18
   c52 d16  2.26 0.4452215 10 0.14079141    41.54412  5.44
   c39 d20  2.80 0.2788867 10 0.08819171    47.37733  2.80
   c52 d20  3.11 0.7908505 10 0.25008887    52.62267  5.91
   c39 d21  2.74 0.9834181 10 0.31098410    65.08314  2.74
   c52 d21  1.47 0.2110819 10 0.06674995    34.91686  4.21

ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) +
  geom_bar(stat="identity") +
  geom_text(aes(y=label_y, label=Weight), vjust=1.5, colour="white")

结果如图3-24所示。


ed296312e68a26067e4a865bdd80350018fe8c76

使用数据标签时,对堆叠顺序的调整最好是通过在计算累积和之前修改因子的水平顺序(参见15.8节)来完成。另一种修改堆叠顺序的方法是在标度中指定breaks参数,但在这里此方法并不合适,因为累计求和的顺序与堆叠的顺序并不一致。

如果想把数据标签置于条形中部(见图3-25),须对累计求和的结果加以调整,并同时略去geom_bar()函数中对y偏移量(offset)的设置:

ce <- arrange(cabbage_exp, Date, Cultivar)

#计算y轴的位置,将数据标签置于条形中部
ce <- ddply(ce, "Date", transform, label_y=cumsum(Weight)-0.5*Weight)

ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar))+
  geom_bar(stat="identity")+
  geom_text(aes(y=label_y, label=Weight), colour="White")


a1040ec999f48aefb4564ed241b7f98e94de459b

为了得到效果更好的条形图(见图3-26),我们修改一下图例顺序和颜色,将数据标签置于条形中间,同时通过字号参数(size)缩小标签字号,并调用paste函数在标签后面添加“kg”,为了使得标签保留两位小数我们还需调用format函数:

ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) +
  geom_bar(stat="identity", colour="black") +
  geom_text(aes(y=label_y, label=paste(format(Weight, nsmall=2), "kg")),
        size=4)+
  guides(fill=guide_legend(reverse=TRUE)) +
  scale_fill_brewer(palette="Pastel1")


ae1281be53940569af9895d673dc33eb5d8411ed

另见
更多关于控制文本格式的内容可参见9.2节。

更多关于分组转换数据的内容可参见15.6节。

相关文章
|
数据可视化 数据挖掘
使用R语言进行多维缩放分析
【4月更文挑战第27天】本文介绍了R语言中的多维缩放分析(MDS)技术,用于高维数据的可视化。MDS通过映射数据点到低维空间保持距离或相似性,帮助理解数据结构。R中的`cmdscale`和`isoMDS`函数可用于构建MDS模型,而`dist`计算距离矩阵。通过实例展示了如何分析消费者对品牌评价,`stressplot`和`procrustes`函数则用于模型解释和验证。R还支持经典MDS、度量MDS和非度量MDS等高级主题,为数据探索提供强大工具。
254 0
|
C++ Python
vsCode修改字体为JetBrains Mono (PyCharm默认字体)
vsCode修改字体为JetBrains Mono (PyCharm默认字体)
3311 0
vsCode修改字体为JetBrains Mono (PyCharm默认字体)
|
6月前
|
SQL 安全 数据处理
《敏感数据的保护伞:SQL数据脱敏全解析》
在数据驱动的时代,敏感数据的安全保护至关重要,而数据脱敏成为关键解决方案。数据脱敏通过特定算法将敏感信息转化为低风险数据,既保障安全又保留数据价值。SQL作为强大的数据处理语言,在数据脱敏中发挥核心作用,从查询、更新到转换,提供全流程技术支持。本文深入探讨数据脱敏的概念、重要性及实施步骤,结合SQL功能解析实际应用,并分析性能优化、复杂逻辑处理及合规性保障等挑战与策略,为数据安全筑起坚实防线。
243 27
|
JavaScript API
Vue2 中使用Swiper构建中间大两边小轮播效果
【10月更文挑战第8天】
1654 122
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
298 9
|
数据采集 缓存 API
淘宝商品详情数据(实时更新,缓存数据)
淘宝商品详情数据,关键用于电商业务和市场分析,包括属性、价格、库存等信息。可通过淘宝开放平台API注册获取权限,调用如`taobao.item.get`接口,或使用爬虫技术。数据可实时更新,也有缓存选项。注意API权限、数据安全和调用限制。第三方服务也是获取数据的途径,但可能非实时且成本高。有效利用数据支持决策和分析。
|
Ubuntu Windows
ARM架构安装ubuntu系统
8月更文挑战第19天
2554 0
|
开发者 Python
【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv‘
【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘配置信息.csv‘
1080 0
|
消息中间件 Java Kafka
【Kafka】微服务学习笔记九:什么是消息中间件&Kafka的介绍及使用
主要介绍什么是消息中间件以及Kafka在Docker上的安装配置及使用,最后还涉及到Kafka高级部分的备份机制。
1293 103
【Kafka】微服务学习笔记九:什么是消息中间件&Kafka的介绍及使用
|
存储 数据可视化 Shell
18 个 Jupyter Notebook 小技巧,帮助你快速腾飞
18 个 Jupyter Notebook 小技巧,帮助你快速腾飞
18 个 Jupyter Notebook 小技巧,帮助你快速腾飞