【发布时间】:2018-03-04 09:53:42
【问题描述】:
我在 R 中使用 ggplot2 创建了许多图,并且想要一种方法来标准化截止线的实现。我有四个城市在大约 10 年的时间段内的许多不同衡量标准的数据。我将它们绘制为折线图,每个城市在给定的图表中都有不同的颜色。我将为我拥有的每个不同的措施(大约 20 个)创建一个图。
在这些图表中的每一个上,我都需要放置两条分界线(旁边有一个词)来表示某些政策的实施,以便阅读图表的人可以轻松识别实施前后的性能差异。以下是我目前正在使用的大致代码。
gg_plot1<- ggplot(data=ggdata, aes(x=Year, y=measure1, group=Area, color=Area)) +
geom_vline(xintercept=2011, color="#EE0000") +
geom_text(aes(x=2011, label="City1\n", y=0.855), color="#EE0000", angle=90, hjust=0, family="serif") +
geom_vline(xintercept=2007, color="#000099") +
geom_text(aes(x=2007, label="City2", y=0.855), color="#000099", angle=0, hjust=1, family="serif") +
geom_line(size=.75) +
geom_point(size=1.5) +
scale_y_continuous(breaks=round(seq(min(ggdata$measure1, na.rm=T), max(ggdata$measure1, na.rm=T), by=0.01), 2)) +
scale_x_continuous(breaks=min(ggdata$Year):max(ggdata$Year)) +
scale_color_manual(values=c("#EE0000", "#00DDFF", "#009900", "#000099")) +
theme(axis.text.x = element_text(angle=90, vjust=1),
panel.background = element_rect(fill="white", color="white"),
panel.grid.major = element_line(color="grey95"),
text = element_text(size=11, family="serif"))
这个实现的问题在于它依赖于将两个geom_text() 放在特定图表上的特定位置。这些不同的措施都有不同的范围,所以为了做到这一点,我需要一个接一个地去寻找一个地方来放置它们。我更愿意做的是将每个绘图的范围缩小 X% 并将 geom_text() 与范围的底部对齐。线条不需要调整(每个情节都在同一年),只需要调整文本的位置。我在这里发现了一些类似的问题,但与在不同范围的不同图表上放置相同位置的特定问题无关。
有没有办法做我正在寻找的东西?如果我不得不猜测,它就像使用相对定位而不是绝对定位,但我无法在 ggplot 中找到这样做。作为记录,我知道这两个geom_text()s 的方向不同。我这样做是为了比较我们更喜欢哪个,但留给大家。我们最终将使用文本旋转 90 度的那个。此外,其中一些将被刻面在一起,这样可能会增加一层难度。还没到那个地步。
侧边栏:另一种可视化方式是在截止年份将线从实线更改为虚线。这可能吗?我不确定客户是否希望这样做,但如果有人能指出我在哪里学习如何做到这一点,我很乐意将其作为一种选择。
编辑添加:
显示使用不同 y 范围运行时会发生什么的示例数据
ggdata <- data.frame(Area=rep(c("City1", "City2", "City3", "City4"), times=7),
Year=c(rep(2006,4), rep(2007,4), rep(2008,4), rep(2009,4), rep(2010,4), rep(2011,4), rep(2012,4)),
measure1=rnorm(28,10,2),
measure2=rnorm(28,50,10))
geom_text()s 位于正确位置的示例图,但这是使用上面的代码在图中固定位置完成的。当我使用具有不同 y 范围的不同度量来复制代码时,它最终会拉伸绘图窗口。
【问题讨论】:
-
请发布示例数据和想要的输出示例。
-
刚刚更新了
-
您的数据框代码会产生错误,而绘图代码也会产生错误,即使数据框错误已解决。请更新示例以使代码正常工作。
-
抱歉,刚刚又更新了。嵌入图像在使用原始数据运行时显示代码。示例数据与示例代码一起运行,并显示了我正在尝试修复的问题。
-
试试:
geom_text(aes(x=2011, label="City1\n", y=min(measure1)*1.1)