r - ggplot2 - 注释外部情节
问题描述
如何在绘图外插入注释?
我想在第一个栏的顶部添加一个注释,以表明它继续,例如高达 1000。如果我使用注释,则注释不会超出情节。(请注意,我使用coord_cartesian
将 y 轴限制为 100。)
这是我的代码。
plot <- ggplot() +
geom_crossbar(data=GHG, aes(x=Study, y=Avg, ymin=Min, ymax=Max),
fill="white", width=0.3) +
coord_cartesian(ylim=c(0, 100), clip="off") +
labs(x="", y="g CO2-eq.") +
annotate("text", x=1, y=150, label=c("150"), vjust=-1) +
theme(legend.position = "bottom",
axis.text.x = element_text(angle=0, vjust=1, hjust=0.5),
panel.grid.major.x= element_blank(),
panel.grid.minor = element_blank(),
plot.margin = unit(c(1,3,1,1),"lines"))
这是图表:
解决方案
一种策略是使用辅助轴和标签来注释您的条形图。这有点棘手,因为只有连续刻度才能有辅助轴。
我将以下内容data.frame
用于测试目的:
GHG <- data.frame(Avg = c(50, 37, 62), Min = c(10, 25, 25), Max = c(1000, 50, 80), Study = c("A", "B", "C"))
编码:
ggplot() +
geom_crossbar(data=GHG, aes(x=as.numeric(Study), y=Avg, ymin=Min, ymax=Max),
fill="white", width=0.3) +
coord_cartesian(ylim=c(0, 100), clip = "on") +
scale_x_continuous(position = "top",
breaks = 1:length(unique(GHG$Study)),
labels = c(1000, rep("", length(unique(GHG$Study)) - 1)),
sec.axis = sec_axis(~.,
breaks = 1:length(unique(GHG$Study)),
labels = rep("", length(unique(GHG$Study))))) +
labs(x="", y="g CO2-eq.") +
theme(legend.position = "bottom",
axis.text.x = element_text(angle=0, vjust=1, hjust=0.5),
panel.grid.major.x= element_blank(),
panel.grid.minor = element_blank(),
plot.margin = unit(c(1,3,1,1),"lines"),
axis.ticks.x.top = element_blank(),
axis.text.x.top = element_text(size = 14, color = "black", margin = margin(b = 5)))
细节:
略微更改以aes
允许连续缩放:aes(x=as.numeric(Study), y=Avg, ymin=Min, ymax=Max)
In coord_cartesian(ylim=c(0, 100), clip = "on")
: clip 设置为on
剪裁超出绘图区域的条形部分。
添加并配置顶部 X 的连续比例:scale_x_continuous(position = "top",
为 Study 的每个值手动添加中断:breaks = 1:length(unique(GHG$Study)),
用您要添加的文本标记第一个中断,其余的中断没有文本:labels = c("text", rep("", length(unique(GHG$Study)) - 1)),
添加辅助轴以将刻度保持在底部。如果您不想要它们,则没有必要:sec.axis = sec_axis(~.,
手动设置连续刻度的中断:breaks = 1:length(unique(GHG$Study)),
并添加空白标签以重现您的示例:labels = rep("", length(unique(GHG$Study))))) +
在该theme
方法中,删除顶轴的刻度:axis.ticks.x.top = element_blank(),
最后自定义顶部标签的字体、颜色和所有内容:axis.text.x.top = element_text(size = 14, color = "black", margin = margin(b = 5)))
推荐阅读
- ruby-on-rails - Ruby遍历两个对象并检查两个对象中是否存在某些东西
- kibana - 在 Vega 中自动调整文本标记的大小
- python - Networkx 和 Networkit 中的介数错误?
- javascript - 多个 Vue 3 观察者和 Typescript ......如何使用?
- vue.js - ApexCharts & Vue - 更改道具值不会更新图表组件中的图表
- aws-load-balancer - aws“网络负载均衡器”是否有 http/https 地址?
- api - Avaya Aura Call Center 实时 api NIrtd_Login 失败
- java - Spring:RestTemplate:无法提取响应:没有合适的 HttpMessageConverter
- python - 使用 pandas 读取子文件夹中的所有文件
- json - 使用 Azure 数据工厂将 JSON 表解析为 csv 格式