【问题标题】:Is there a way to add a legend for ggplot's alpha?有没有办法为 ggplot 的 alpha 添加图例?
【发布时间】:2017-04-30 00:11:51
【问题描述】:

我有一个包含许多重叠点的图(从 2 到 10)。在点上添加抖动会使其非常嘈杂且没有吸引力。我喜欢在美学中添加一个阿尔法。但是,我想要一个图例,让读者可以看到每个透明胶片有多少重叠的点。有没有这样的方法?

ggplot(data=mydata,aes(x=x,y=y)) + geom_point(size=3,shape=2,aes(alpha=1/3))

假设我使用上面的代码。我将如何为 alpha 加入图例?

【问题讨论】:

  • 这并没有回答你的问题,但也许只是有点透明的抖动可能不会太吵,但仍然表明点数。
  • 您可以将数据导入GGobi,并在出现过度绘图的区域使用画笔工具,从而导出显示描述并在R中使用rggobiDescribeDisplay包进行操作。反之亦然。

标签: r ggplot2


【解决方案1】:

这是一个如何伪造的示例。尝试几次,同时改变alpha

require(ggplot2)

n = 10000
alpha = 0.01

set.seed(12345)
data = data.frame(replicate(2, rnorm(n)))

dev.new(width=4, height=3)
p = qplot(X1, X2, data=data, alpha=alpha)

fake_scale = scale_alpha('# of overlapping pts', breaks=pretty(c(alpha, 1)), labels=as.character(pretty(c(alpha, 1))/alpha))

p + fake_scale

alpha = 0.1

alpha = 0.01

【讨论】:

  • 由于某种原因这对我不起作用(图例中的点都是相同的黑暗)。你用的是ggplot2的开发者版吗?
  • 嗨,joran - 我不这么认为。我在 i386-apple-darwin9.8.0 下使用 ggplot2_0.8.8、plyr_1.4 和 R 版本 2.11.1。绘图正在通过石英设备打印为 png。
  • 啊,好的。好吧,它似乎不适用于带有 R 2.13.1 和 ggplot2_0.8.9 的 OS X。仅供参考。
  • 啊,是的。一定已经堵住了让我在alpha=alpha 中用恒定值而不是alpha=I(alpha) 伪造的漏洞,同时仍然认为存在真正的阿尔法美学。
【解决方案2】:

不完全是你想要的,但是 geom_hex() 怎么样?

如果你不离散化(bin)它,我认为 R 需要计算重叠区域和重叠的数量(sp?)(这也取决于点的大小),这听起来很难。

library(hexbin)

mydata <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(data=mydata,aes(x=x,y=y)) + geom_hex()

【讨论】:

  • 非常感谢。这几乎正​​是我想要的。要是我能把六边形变成圆圈就好了……
  • 祝你好运让圆圈平铺飞机;)
  • 哈!我想下一个最好的办法就是使用 geom_point 但创建另一个计数列并将其设置为大小。
  • 或 ?sunflowerplot 获取更多离散数据
【解决方案3】:

从其他答案中获取线索,您似乎可能希望将 x-y 点分箱为唯一值,然后将每个 x-y 坐标箱的唯一值数量相加。

使用来自另一个答案的虚假数据,

library(ggplot2)
library(dplyr)
library(magrittr)

n = 10000

set.seed(12345)
data = data.frame(replicate(2, rnorm(n)))

我按小数点后第 1 位分箱,然后计算每个箱中有多少个

data2 <- data %>% mutate(
  x = round(X1,1),  
  y = round(X2,1)
) %>% 
  group_by(x,y) %>%
  tally() %>% 
  dplyr::filter(n<=10) %>% 
  mutate(transp = n/10) 

出于说明目的,我过滤掉了最大的垃圾箱。现在,transp 列有你想要的计算,你可以提供给alpha 并在图例中得到它

data2 %>% 
  ggplot(aes(x=x,y=y)) + 
  geom_point(aes(alpha = as.factor(transp))) + 
  scale_alpha_discrete(
    "Number of overlapping points",
    labels = 1:10
  )+ 
  theme(legend.position = "bottom")

图片:

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多