我希望复制这篇文章中第一个情节的设计:
这取自[1],但在该书中没有显示该图的代码。
链接中的这个数字没有图例,而是显示标签'IN','MO'等。以交错的方式定位在它们所代表的相应线的高度处。我知道如何使用ggplot2制作绘图,但我遇到的具体问题是编写代码以使图像右侧的标签像这样。有人可以演示如何做到这一点吗?
1:Carr,Daniel&琳达皮克尔。 2009.使用Micromaps可视化数据模式。佛罗里达州博卡罗坦。 CRC Press。
答案 0 :(得分:3)
这不是一件容易的事,特别是以编程方式执行。它涉及与grobs
合作,没有什么困难,但通常是在成品上手动完成,而不是在程序上生成。
df <- read.table(text = 'Samples Day.1 Day.2 Day.3 Day.4
Seradigma335 1.2875 1.350 1.850 1.6125
Seradigma322 0.9375 2.400 1.487 1.8125
Sigma 1.1250 1.962 1.237 2.0500
Shapiro_red 0.7750 1.575 1.362 1.0125
Shapiro_w/red 0.7750 1.837 0.975 0.8250', header = T)
(取自SO上的另一个问题)
library(tidyr)
library(ggplot2)
tidy_df <- df %>%
gather('Day','Value', -Samples)
g <- ggplot(tidy_df) +
geom_line(aes(Day, Value, group = Samples), show.legend = F) +
scale_x_discrete(expand = c(.02,0)) +
scale_y_continuous(limits = c(0,3)) +
theme_grey() +
theme(plot.margin = unit(c(0,.2,0,0), 'npc'),
panel.border = element_rect(color = 'black', fill = NA),
axis.ticks = element_blank()
)
请注意右边距(使用plot.margin = unit(c(0,.2,0,0), 'npc')
设置)
library(cowplot)
g <- g +
draw_label(label = df$Samples[1], x = 4.1, y = df$Day.4[1], hjust = 0) +
draw_label(label = df$Samples[2], x = 4.1, y = df$Day.4[2], hjust = 0) +
draw_label(label = df$Samples[3], x = 4.1, y = df$Day.4[3], hjust = 0) +
draw_label(label = df$Samples[4], x = 4.1, y = df$Day.4[4], hjust = 0) +
draw_label(label = df$Samples[5], x = 4.1, y = df$Day.4[5], hjust = 0)
我们将标签直接添加到绘图中(与grob相反,请参见文档),其中x
为4.1,因此它实际上就在面板之外(Day.4
具有x
的{{1}}并且由边距覆盖(它被称为剪裁)。
# transform to grob
gt <- ggplotGrob(g)
# set panel's clipping to off
gt$layout$clip[gt$layout$name == "panel"] <- "off"
# draw the grob
ggdraw(gt)
我们可以使用for loop
:
for (i in 1:nrow(df)) {
g <- g + draw_label(label = df$Samples[i], x = 4.1, y = df$Day.4[i], hjust = 0)
}
但是,我们不能像往常一样对美学进行映射。
正如我在开始时所说的那样,这些方法需要相当多的工作来找到正确的平衡和定位,这对于快速绘图肯定是可以预期的,但如果必须要发布某些内容,则可能值得。
答案 1 :(得分:1)
您可以将geom_label
与nudge_x
参数一起使用,如下所示:
library(data.table) # I always use data.table but not required
library(ggplot2)
a <- c(1:10)
b <- c(seq(1,20,2))
c <- c(seq(1,30,3))
d <- c(1:10)
aa <- data.table(a,b,c,d)
ggplot(aa)+
geom_line(aes(a,b))+
geom_line(aes(a,c))+
geom_line(aes(a,d))+
geom_label(aes(10,10), label = "line 1", nudge_x = 1)+
geom_label(aes(10,19), label = "line 2", nudge_x = 1)+
geom_label(aes(10,29), label = "line 3", nudge_x = 1)
您可以直接输入与标签所需位置对应的有序对。情节看起来像这样: