在ggplot2中给geom_rect()添加标签

4

我是一名初学者,如果我的问题太基础,请原谅。自从我打出第一个ggplot2命令以来已经过去了大约4天。在发布之前,我阅读了如何在ggplot2中将渐变填充应用于geom_rect对象?,但这篇文章似乎专注于生成渐变矩形,我已经完成了这个步骤。

目标:我想突出显示哪些美国总统的失业率> 10000(单位不重要,因为我的重点是能够绘制图表)。

presidential <- subset(presidential, start > economics$date[1])
ggplot(economics) +
       geom_rect(
         aes(xmin = start, xmax = end, fill = party),
         ymin = -Inf, ymax = Inf, alpha = 0.2,
         data = presidential
       ) +
       geom_vline(
         aes(xintercept = as.numeric(start)),
         data = presidential,
         colour = "grey50", alpha = 0.5
       ) +
       geom_text(
         aes(x = start, y = 2500, label = name),
         data = presidential,
         size = 3, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE
       ) +
       geom_line(aes(date, unemploy)) +
       geom_rect(
         aes(xmin = start, xmax = end),
         ymin = 10000, ymax = Inf, alpha = 0.4, fill = "chartreuse",
         data = presidential
       ) +
       geom_text(
         aes(x = as.Date("1993-01-20"), y = 12000, label = "High unemployment"),
         size = 3, vjust = 0, hjust = 0, color = "forestgreen"
       )+
       scale_fill_manual(values = c("blue", "red")) 

图形输出如下: Graph 我们可以看到,我成功创建了绿色矩形的标签,显示失业率大于10000。然而,我对这种方法并不满意,因为这只是一个快速修复(即通过调整x、y、nudges等参数使其正常工作)。如果轴的刻度改变会怎样呢?文本将会变形或可能无法显示。我的两个问题如下:
问题1:有没有办法以编程方式标记绿色矩形,使得失业率大于10000?我不太关心是否使用文本、标签或图示。我假设使用geom_text()需要快速修复(即通过不断调整x、y、vjust、hjust和nudges来确保文本的正确显示,需要进行多次运行和重复),但设置图例或标签可能是自动的。
问题2:这是一个概念性问题——当我调用scale_fill_manual()时,ggplot2如何知道我想要用红色和蓝色来表示垂直矩形还是水平矩形?我很好奇。为什么它没有要求我同时提供水平和垂直矩形的颜色?难道是因为我已经使用color = forestgreen为水平矩形提供了一个恒定的颜色,所以它只需要为剩余的垂直矩形对提供颜色,即红色和蓝色?
我是一名初学者,如果我的问题对于一些人来说太基础了,我很抱歉。感激您的任何帮助。
更新:
以下是数据的dput:
structure(list(name = c("Nixon", "Ford", "Carter", "Reagan", 
"Bush", "Clinton", "Bush", "Obama"), start = structure(c(-346L, 
1681L, 2576L, 4037L, 6959L, 8420L, 11342L, 14264L), class = "Date"), 
    end = structure(c(1681L, 2576L, 4037L, 6959L, 8420L, 11342L, 
    14264L, 17186L), class = "Date"), party = c("Republican", 
    "Republican", "Democratic", "Republican", "Republican", "Democratic", 
    "Republican", "Democratic")), .Names = c("name", "start", 
"end", "party"), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))

经济数据可以通过 ggplot2 包公开获取

 head(economics)
# A tibble: 6 x 6
        date   pce    pop psavert uempmed unemploy
      <date> <dbl>  <int>   <dbl>   <dbl>    <int>
1 1967-07-01 507.4 198712    12.5     4.5     2944
2 1967-08-01 510.5 198911    12.5     4.7     2945
3 1967-09-01 516.3 199113    11.7     4.6     2958
4 1967-10-01 512.9 199311    12.5     4.9     3143
5 1967-11-01 518.1 199498    12.5     4.7     3066
6 1967-12-01 525.8 199657    12.1     4.8     3018

请提供可重现的示例(即数据) - Cyrus Mohammadian
@CyrusMohammadian 上面的代码使用了标准的ggplot2库和包,例如经济学和总统。你有看到任何错误吗? - watchtower
你的问题不是关于错误的。我知道你正在使用“ggplot2”,但我想要的是你的原始数据,这样我才能帮助你解决问题。请参考此指南以在SO上发布问题:https://dev59.com/eG025IYBdhLWcg3whGSx - Cyrus Mohammadian
@CyrusMohammadian 我清除了内存并运行了上面发布的代码。我能够复制图表。我不确定出了什么问题,所以我已经发布了我的数据和 head(economics)dput() - watchtower
是的,我不太清楚,你应该删除dput数据,因为它只是头部(不是你的实际数据)。只需提到这是从该软件包加载的数据即可。 - Cyrus Mohammadian
1个回答

5
presidential <- subset(presidential, start > economics$date[1])
ggplot(economics) +
       geom_rect(
         aes(xmin = start, xmax = end, fill = party),
         ymin = -Inf, ymax = Inf, alpha = 0.2,
         data = presidential
       ) +
       geom_vline(
         aes(xintercept = as.numeric(start)),
         data = presidential,
         colour = "grey50", alpha = 0.5
       ) +
       geom_text(
         aes(x = start, y = 2500, label = name),
         data = presidential,
         size = 3, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE
       ) +
       geom_line(aes(date, unemploy)) +
       geom_rect(
         aes(xmin = start, xmax = end, fill = "chartreuse"),
         ymin = 10000, ymax = Inf, alpha = 0.4,
         data = presidential
       ) +
       geom_text(
         aes(x = as.Date("1993-01-20"), y = 12000, label = "High unemployment"),
         size = 3, vjust = 0, hjust = 0, color = "forestgreen"
       )+
       scale_fill_manual(values = c("chartreuse", "red", "blue"), labels=c("High Unemployment","Democrat","Republican"))+labs(fill="")

enter image description here

就您的第二个问题而言,颜色是在垂直方向上进行映射的,因为您最初的调用……


(Note: This is the translated version of the original text.)
geom_rect(
         aes(xmin = start, xmax = end, fill = party),
         ymin = -Inf, ymax = Inf, alpha = 0.2,
         data = presidential
       ) 

该段代码用于确定矩形的起始日期和结束日期,而对于y轴,尺寸被设置为Inf,因此颜色沿垂直方向映射。


非常感谢您的回复!我不太明白问题的第二部分。我理解geom_rect()的限制。我的问题是,ggplot2如何在“高失业率”矩形和“民主党或共和党”矩形之间分配颜色?实际上,我想知道ggplot2分配颜色的顺序是什么?例如,scale_fill_manual(values = c("chartreuse", "red", "blue")可以分配给{unempl,dem,rep}或{dem,rep,unempl}或{rep,dem,unempl}等(即任意一种六种组合)。您能帮助我吗? - watchtower
你可以在scale_fill_manual()函数调用中使用valueslabels选项来设置它们。 - Cyrus Mohammadian
如果您将代码中的最后一行更改为scale_fill_manual(values = c("blue", "red","chartreuse"), labels=c("Democrat","Republican","High Unemployment"))+labs(fill=""),那么您会发现颜色分配出现了扭曲。即蓝色出现在应该是查特鲁斯的位置。查特鲁斯颜色也是如此。有什么想法吗? - watchtower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接