如何在绘图轴上显示组变量和数字中点?

问题描述

我有一些数据,这是其中的一个子集:

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 轴上显示 AgeGroup 刻度线下的相关 AgeAge 值是 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%)。我在年龄组标签周围加上引号,以阻止 SO 将其中的每个数字显示为橙色数字。

如何将这些信息添加到我的图表中?我搜索了辅助标签,但只找到了与辅助轴有关的问题。如您所见,所需的分组信息存储在 AgeGroup 中,因此我“只需要”从那里提取相关值。

编辑:我加载了 ggh4x 包,ggplot 代码现在是这样的:

ggplot(data = MyDataToSO,aes(interaction(Age,AgeGroup),Proportion)) +
geom_point() +
geom_point(data = subset(MyDataToSO,by = 10)) +
guides(x = "axis_nested") +
labs(x = "Age group",y = "Proportion")

但是由于 x 轴是连续的,所以它给出了一个错误

编辑 2:绿点是插值。我现在有 17 到 20 岁的插值。但是这些重复了相同的 AgeGroup 标签。这是个问题吗?

解决方法

ggh4x 包有一个函数可以扩展 ggplot2 以更自动的方式执行此操作(https://cran.r-project.org/web/packages/ggh4x/vignettes/PositionGuides.html,向下滚动到“嵌套关系”)。

,

一种快速简便的方法是创建一个列表或变量,在其中附加来自 MyDataToSO$AgeMyDataToSO$AgeGroup 的值,并用两个回车符(即 \n)分隔。您将将该列表/变量传递给 scale_x_continuous 的“标签”指令。

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

enter image description here

,

另一种方法是添加注释,关闭剪辑,并在轴文本和轴标题之间放置更多空间,如下所示:

ggplot(data = MyDataToSO,y = Proportion)) +
  geom_point() +
  geom_point(data = subset(MyDataToSO,color = "green") +
scale_x_continuous(breaks=seq(0,by = 10)) +
  labs(x = "Age group",y = "Proportion") +
  annotate("rect",fill = "gray80",xmin = c(0,5,10,15,18),xmax = c(5,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)))

enter image description here

编辑:根据我对附加评论的理解,现在单独拆分 15:21。

MyDataToSO <- data.frame(Age = c(2,15:21),.740,.677,.610,.540,.470,.401))


ggplot(data = MyDataToSO,color = "green") +
  scale_x_continuous(breaks=seq(0,15:21) - 0.4,16:22) - 0.6,x = MyDataToSO$Age,l = 0)))

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...