大小为 0 的线仍由 geom_line 绘制
Line with size=0 still drawn by geom_line
所以我有 data.frame
某些物种的 activity 穿越时空。这是其中的一部分:
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))
如您所见,我将activity归类为4类(0到3)。现在我想绘制一个图表,将 activity 显示为一条线。我为此使用 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,因为那样会导致我的行过早结束。
我想我可以自己解决这个问题,方法是将这些线设为白色(或颜色=NA):
ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet)) +
geom_line(aes(size=activiteit,colour=ifelse(activiteit==0,NA,"black")))
但这让我陷入了更深的麻烦。有谁知道为什么这不起作用(奖金问题!)。
这对你有用吗?
你先为你想要的子集
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不是情节。
诚然,这样做有点烦人。让我回顾一下您尝试中的一些内容,以及为什么它首先不起作用。
首先,简单地说明 size=activiteit
并不意味着值为 0 将导致大小为 0。ggplot
首先进行缩放,默认情况下大小在 1 和 6 之间。如果你想要要映射到实际值,您必须使用 scale_size_identity()
或调整 scale_size_continuous
中的 range
。不幸的是,调整它会得到更好的图表,但由于我也不明白的原因,这条线仍然可见。
接下来,您的第二次尝试也不起作用,因为您现在正在映射值 '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))
所以我有 data.frame
某些物种的 activity 穿越时空。这是其中的一部分:
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))
如您所见,我将activity归类为4类(0到3)。现在我想绘制一个图表,将 activity 显示为一条线。我为此使用 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,因为那样会导致我的行过早结束。
我想我可以自己解决这个问题,方法是将这些线设为白色(或颜色=NA):
ggplot(df, aes(x=periode,y=soort_wet, group=soort_wet)) +
geom_line(aes(size=activiteit,colour=ifelse(activiteit==0,NA,"black")))
但这让我陷入了更深的麻烦。有谁知道为什么这不起作用(奖金问题!)。
这对你有用吗?
你先为你想要的子集
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不是情节。
诚然,这样做有点烦人。让我回顾一下您尝试中的一些内容,以及为什么它首先不起作用。
首先,简单地说明 size=activiteit
并不意味着值为 0 将导致大小为 0。ggplot
首先进行缩放,默认情况下大小在 1 和 6 之间。如果你想要要映射到实际值,您必须使用 scale_size_identity()
或调整 scale_size_continuous
中的 range
。不幸的是,调整它会得到更好的图表,但由于我也不明白的原因,这条线仍然可见。
接下来,您的第二次尝试也不起作用,因为您现在正在映射值 '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))