没有图例的六个变线图

时间:2017-03-09 03:06:18

标签: r ggplot2

我希望复制这篇文章中第一个情节的设计:

http://stats.blogoverflow.com/2011/12/andyw-says-small-multiples-are-the-most-underused-data-visualization/

这取自[1],但在该书中没有显示该图的代码。

链接中的这个数字没有图例,而是显示标签'IN','MO'等。以交错的方式定位在它们所代表的相应线的高度处。我知道如何使用ggplot2制作绘图,但我遇到的具体问题是编写代码以使图像右侧的标签像这样。有人可以演示如何做到这一点吗?

1:Carr,Daniel&琳达皮克尔。 2009.使用Micromaps可视化数据模式。佛罗里达州博卡罗坦。 CRC Press。

2 个答案:

答案 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()
        ) 

enter image description here 请注意右边距(使用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)

enter image description here

备注

我们可以使用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_labelnudge_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)

您可以直接输入与标签所需位置对应的有序对。情节看起来像这样:

enter image description here