繁体   English   中英

尺寸= 0的线仍由geom_line绘制

[英]Line with size=0 still drawn by geom_line

所以我有一个特定物种随时间变化的数据data.frame 这是其中的一部分:

df <- structure(list(soort_wet = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 
        2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
        2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
        2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("Callophrys rubi", 
            "Coenagrion hastulatum"), class = "factor"), periode = structure(c(1L, 
                            1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 
                            9L, 10L, 10L, 11L, 11L, 12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L, 
                            16L, 16L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 21L, 22L, 
                            22L, 23L, 23L, 24L, 24L, 25L, 25L), .Label = c("1-mrt", "10-mrt", 
                  "20-mrt", "1-apr", "10-apr", "20-apr", "1-mei", "10-mei", "20-mei", 
                  "1-jun", "10-jun", "20-jun", "1-jul", "10-jul", "20-jul", "1-aug", 
                  "10-aug", "20-aug", "1-sep", "10-sep", "20-sep", "1-okt", "10-okt", 
                  "20-okt", "30-okt"), class = "factor"), activiteit = c(NA, NA, 
                    NA, NA, NA, NA, NA, NA, 0, NA, 1, 0, 1, 1, 3, 2, 3, 3, 3, 3, 
                    3, 3, 1, 2, 1, 2, 0, 1, 0, 1, NA, 1, NA, 0, NA, NA, NA, NA, NA, 
                   NA, 0, NA, 0, NA, NA, NA, NA, NA, NA, NA)), .Names = c("soort_wet", 
                   "periode", "activiteit"), class = "data.frame", row.names = c(9L, 
                           15L, 70L, 76L, 131L, 137L, 192L, 198L, 253L, 259L, 314L, 320L, 
                           375L, 381L, 436L, 442L, 497L, 503L, 558L, 564L, 619L, 625L, 680L, 
                           686L, 741L, 747L, 802L, 808L, 863L, 869L, 924L, 930L, 985L, 991L, 
                           1046L, 1052L, 1107L, 1113L, 1168L, 1174L, 1229L, 1235L, 1290L, 
                           1296L, 1351L, 1357L, 1412L, 1418L, 1473L, 1479L))

如您所见,我将活动分为4类(0到3)。 现在,我想绘制一个图形,将活动显示为一条线。 我为此使用ggplot2:

library(ggplot2)

# First attempt: size = 0 is still plotted as a line
ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet)) +
  geom_line(aes(size=activiteit))

在此处输入图片说明

好吧,这几乎是我想要的,除了:我想要acitiviteit == 0的行,因此没有绘制size == 0的行。 所以我的第一个问题是,为什么要绘制size == 0的线,我该如何解决呢? 请注意,我不想用NA替换0,因为那样会导致我的行过早结束。

我以为自己可以解决这些问题,只需将这些行设置为白色(或colour = NA)即可:

ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet)) +
  geom_line(aes(size=activiteit,colour=ifelse(activiteit==0,NA,"black")))

但这使我陷入了更深的麻烦。 有谁知道为什么这行不通(额外的问题!)。

在此处输入图片说明

诚然,这有点烦人。 让我回顾一下您尝试中的一些内容以及为什么它首先没有起作用。

首先,简单说明size=activiteit并不意味着值0会导致大小为ggplot进行缩放,默认情况下介于1和6之间。如果要映射到实际值,则必须使用scale_size_identity()或调整scale_size_continuousrange 不幸的是,对此进行调整会得到更好的图形,但是由于我也不明白的原因,该线仍然可见。

接下来,您的第二次尝试也不起作用,因为您现在正在映射值'black' (这种方法将在base R中起作用)。

现在,要解决所有这些问题,我们可以在activiteit == 0时创建一个新的TRUE变量,并将该变量映射到alpha ,以便使该行的一部分透明。

示例代码:

df$alp <- ifelse(df$activiteit == 0, T, F)

ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet, alpha=alp)) +
  geom_line(aes(size=activiteit)) + theme_bw() +
  scale_alpha_manual(values = c("TRUE" = 0, "FALSE" = 1), guide = 'none') +
  scale_size_continuous(range = c(0, 15)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

结果是:

在此处输入图片说明

编辑:

我只是意识到有一种更简单的方法,您可以将大小比例的限制调整为不包含0:

ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet)) +
  geom_line(aes(size=activiteit)) + theme_bw() +
  scale_size_continuous(range = c(3, 15), limit = c(1, 3)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

在此处输入图片说明

那对你有用吗?

您首先要子集

df_s <- df %>% filter(activiteit > 0)

然后画

ggplot(df_s, aes(x=periode,y=soort_wet, group=soort_wet)) +
  geom_line(aes(size=as.factor(activiteit)))

您的大小0不是情节。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM