ggplot2按数字设置点大小:当值为0时不显示点

3

我有两个时间序列的数据,我想将它们绘制在一起。x轴将是日期,y轴将是系列1的折线图,而点的大小将根据系列2的数值进行缩放。但是,当系列2 = 0时,我希望ggplot不显示任何点。我尝试设置点大小的范围为最小值为0,但仍会显示值为0的点。

以下是重现问题的代码:

Dates = c("2015-05-01", "2015-05-02", "2015-05-03", "2015-05-04", "2015-05-05", "2015-05-06")
Dates = as.Date(Dates)
Series1 = c(0,2,8,5,3,1)
Series2 = c(0,0,5,0,10,5)

df = data.frame(Dates, Series1, Series2)
ggplot(data = df)+
   geom_line(aes(x=Dates, y = Series1))+
   geom_point(aes(x=Dates, y = Series1, size = Series2))+
   scale_size_continuous(range = c(0, 5))

这将产生以下图形: PointSize=0 Displayed 如何使ggplot2在Series2 = 0时不创建点,但仍显示线条? 我还尝试用NA替换Series2中的0,但这会导致绘图失败。

也许是因为我们在查看或保存时存在差异,因为使用您的代码,我得到了大小为0但不显示的点。不确定为什么它们看起来不同;也许分辨率不同?但数据可视化迷会认为,您应该按比例缩放面积而不是半径,这就是为什么scale_size_area只需要一个最大值,以便将0值放置在大小为0的位置。 - camille
2个回答

4
您可以将最小值更改为负数:
ggplot(data = df) +
  geom_line(aes(x = Dates, y = Series1))+
  geom_point(aes(x = Dates, y = Series1, size = Series2))+
  scale_size_continuous(range = c(-1, 5)) 

如果您不想在图例中包含0,可以添加 breaks:
scale_size_continuous(range = c(-1, 5), breaks = seq(2.5, 10, 2.5)) 

enter image description here


3
另一个选项是利用alpha来使size == 0的点不可见。我们在aes中将alpha设置为逻辑表达式Series2 == 0,然后使用scale_alpha_manual将值设置为1(FALSE)或0(不可见):Original Answer。
ggplot(data = df)+
    geom_line(aes(x=Dates, y = Series1))+
    geom_point(aes(x=Dates, y = Series1, size = Series2, alpha = Series2 == 0))+
    scale_size_continuous(range = c(1, 5)) +
    scale_alpha_manual(values = c(1,0)) +
    guides(alpha = FALSE)     # Hide the legend for alpha

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接