我有一些数据,这是其中的一个子集:
MyDataToSO <- data.frame(Age = c(2, 7, 12, 16, 21),
AgeGroup = c("0-4 years", "5-9 years", "10-14 years", "15-17 years", "18-24 years"),
Proportion = c(0.963, 0.965, 0.925, 0.701, 0.422))我希望绘制数据,以便在x轴上获得在Age标记下显示的相关AgeGroup。Age值是AgeGroup类别的中间点。
我得到了我想要的图,除了在x轴的相关部分下添加AgeGroup波段:
ggplot(data = MyDataToSO, aes(x = Age, y = Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO, Age %in% c(16,21)), color = "green")
scale_x_continuous(breaks=seq(0, 30, by = 10)) +
labs(x = "Age group", y = "Proportion")该图正常工作,显示了正确位置的相关Age,但没有迹象表明Age值来自不同的年龄组。
我认为通过在x轴上有第二个标签来显示这一点会很有用,这样得到的x轴看起来有点像:
|
|______________________________...
| | | ...
2 7 12 ...
|__________|_________|_________|...
"0-4 years 5-9 years 10-14 years"...我需要稍微调整一下字体大小才能让它正常工作。我还想让年龄组的线条比正常印刷的线条更亮(例如,比正常印刷的不透明度低25% )。我已经在年龄组标签周围放置了引号,以防止将每个数字显示为橙色数字。
如何将此信息添加到我的图表中?我搜索了二级标签,但只找到了与二级轴相关的问题。如您所见,所需的分组信息存储在AgeGroup中,因此我“只”需要从那里提取相关值。
编辑:我加载了ggh4x包,ggplot代码现在是这样:
ggplot(data = MyDataToSO, aes(interaction(Age, AgeGroup), Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO, Age %in% c(16,21)), color = "green")
scale_x_continuous(breaks=seq(0, 30, by = 10)) +
guides(x = "axis_nested") +
labs(x = "Age group", y = "Proportion")但它给出了一个错误,因为x轴是连续的。
编辑2:绿点是插值。我现在有从17岁到20岁的插值法,但这些插值法重复了相同的AgeGroup标签。这是一个问题吗?
发布于 2021-02-14 10:09:48
另一种方法是添加注释,关闭裁剪,并在轴文本和轴标题之间放置更多空间,如下所示:
ggplot(data = MyDataToSO, aes(x = Age, y = Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO, Age %in% c(16,21)), color = "green") +
scale_x_continuous(breaks=seq(0, 30, by = 10)) +
labs(x = "Age group", y = "Proportion") +
annotate("rect", fill = "gray80",
xmin = c(0, 5, 10, 15, 18),
xmax = c(5, 10, 15, 18, 24) - 0.2,
ymin = 0.28, ymax = 0.32) +
annotate("text", size = 3,
x = MyDataToSO$Age + 0.5,
y = 0.3, label = MyDataToSO$AgeGroup) +
coord_cartesian(ylim = c(0.4, 1), clip = "off") +
theme(axis.title.x = element_text(margin = margin(t = 25, r = 0, b = 0, l = 0)))

编辑:根据我对其他评论的理解,现在将15:21分开。
MyDataToSO <- data.frame(Age = c(2, 7, 12, 15:21),
AgeGroup = c("0-4 years", "5-9 years", "10-14 years", 15:21),
Proportion = c(0.963, 0.965, 0.925, 0.701, .740, .677, .610, .540, .470, .401))
ggplot(data = MyDataToSO, aes(x = Age, y = Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO, Age %in% c(16,21)), color = "green") +
scale_x_continuous(breaks=seq(0, 30, by = 10)) +
labs(x = "Age group", y = "Proportion") +
annotate("rect", fill = "gray80",
xmin = c(0, 5, 10, 15:21) - 0.4,
xmax = c(5, 10, 15, 16:22) - 0.6,
ymin = 0.28, ymax = 0.32) +
annotate("text", size = 3,
x = MyDataToSO$Age,
y = 0.3, label = MyDataToSO$AgeGroup) +
coord_cartesian(ylim = c(0.4, 1), clip = "off") +
theme(axis.title.x = element_text(margin = margin(t = 25, r = 0, b = 0, l = 0)))

发布于 2021-02-14 11:07:26
ggh4x包有一个扩展ggplot2的功能,它以一种更自动化的方式(https://cran.r-project.org/web/packages/ggh4x/vignettes/PositionGuides.html,向下滚动到“嵌套关系”)来实现这一点。
发布于 2021-02-14 10:06:14
一种快速而简单的方法是创建一个列表或变量,将MyDataToSO$Age和MyDataToSO$AgeGroup中的值附加到其中,并用两个回车符(即\n)分隔。您将把这个列表/变量传递给scale_x_continuous的'labels‘指令。
library(tidyverse)
MyDataToSO <- tibble(Age = c(2, 7, 12, 16, 21),
AgeGroup = c("0-4 years", "5-9 years", "10-14 years", "15-17 years", "18-24 years"),
Proportion = c(0.963, 0.965, 0.925, 0.701, 0.422)) %>%
mutate(custom_labels = paste0(Age, "\n\n", AgeGroup)) ## This is where you create the custom labels
ggplot(data = MyDataToSO, aes(x = Age, y = Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO, Age %in% c(16,21)), color = "green") +
scale_x_continuous(breaks=seq(0, 30, by = 10)) +
labs(x = "Age group", y = "Proportion") +
scale_x_continuous(breaks = c(MyDataToSO$Age), ## Here you pass the relevant ages. Should be aligned with the custom_labels
labels = c(MyDataToSO$custom_labels)) ## Here you pass the custom label balues

https://stackoverflow.com/questions/66191504
复制相似问题