气泡图中形状、颜色和图例与变量子集的匹配

matching of shape, color and legend in bubble plot with subset of variable

我有一些数据

library(data.table)
wide <- data.table(id=c("A","C","B"), var1=c(1,6,1), var2=c(2,6,5), size1=c(11,12,13), size2=c(10,12,10), flag=c(FALSE,TRUE,FALSE))
> wide
   id var1 var2 size1 size2  flag
1:  A    1    2    11    10 FALSE
2:  C    6    6    12    12  TRUE
3:  B    1    5    13    10 FALSE

我想将其绘制为气泡图,其中 idvar2 排序,气泡如下: ID A 和 B:var1 绘制在 size1 中,"empty bubbles" 和 var2 绘制在 size2 中,带有 "filled" 个气泡。 ID C 被标记是因为只有一个值(这就是 var1=var2 的原因)并且它应该具有不同颜色的 "filled bubble"。

我试过如下:

cols <- c("v1"="blue", "v2"="red", "flags"="green")
shapes <- c("v1"=16, "v2"=21, "flags"=16)
p1 <- ggplot(data = wide, aes(x = reorder(id,var2))) + scale_size_continuous(range=c(5,15))
p1 <- p1 + geom_point(aes(size=size1, y = var1, color = "v1", shape = "v1")) 
p1 <- p1 + geom_point(aes(size=size2, y = var2, color = "v2", shape = "v2", stroke=1.5))
p1 <- p1 + geom_point(data=subset(wide,flag), aes(size=size2[flag], y=var2[flag], color= "flags", shape="flags"))
p1 <- p1 + scale_color_manual(name = "test", 
                                values = cols,
                                labels = c("v1", "v2", "flags"))
p1 <- p1 + scale_shape_manual(name = "test", 
                              values = shapes,
                              labels = c("v1", "v2", "flags"))

这给出了(在我的主题中)

但还有两个问题:

  1. 传说中的顺序怎么了?我遵循了 Two geom_points add a legend 中底部解决方案的配方,但不知何故顺序不匹配。
  2. 如何去掉绿色气泡周围的描边,为什么会有?

总的来说,匹配形状和颜色似乎出了点问题。

我承认,我花了一段时间才看懂你这有点绕的情节。原谅我,但我允许自己改变绘图方式,并使用(更好?)使用 ggplot。

数据形状不太理想。 ggplot 非常适合处理长数据。 重塑数据有点靠猜测,我决定采用快速而肮脏的方法来简单地绑定选定列中的行。

现在您可以看到,只需调用一次 geom_point 即可完成新情节。剩下的就是"scale_aesthetic"魔术...

为了结合形状和颜色图例,最安全的是使用override.aes。但要小心!它不采用命名向量,因此值的顺序需要完全按照图例键给出的顺序 - 如果您没有定义因子水平,通常是字母顺序。

更新回复:请求订购 x 标签

这在很大程度上取决于实际的数据结构。如果最初如您所展示的那样,我会 首先 id 作为一个因素,根据您的 var2 排序级别。然后,进行数据整形。

library(tidyverse)
# data reshape
wide <- data.frame(id=c("C","B","A"), var1=c(1,6,1), var2=c(2,6,5), size1=c(11,12,13), size2=c(10,12,10), flag=c(FALSE,TRUE,FALSE))
wide <- wide %>% mutate(id = reorder(id, var2))

wide1 <- wide %>% filter(!flag) %>%select(id, var = var1, size = size1)
wide2 <- wide %>%  filter(!flag) %>% select(id, var = var2, size = size2)
wide3 <- wide %>% filter(flag) %>% select(id, var = flag, size = size2) %>%
  mutate(var = 6)
long <- bind_rows(list(v1 = wide1, v2 = wide2, flag = wide3), .id = "var_id") 

# rearrange the vectors for scales aesthetic
cols <- c(flag="green", v1 ="blue", v2="red" )
shapes <- c(flag=16, v1=16, v2 =21 )

ggplot(data = long, aes(x = id, y = var)) + 
  geom_point(aes(size=size, shape = var_id, color = var_id), stroke=1.5) +
  scale_size_continuous(limits = c(5,15),breaks = seq(5,15,5)) +
  scale_shape_manual(name = "test", values = shapes) +
  scale_color_manual(values = cols, guide = FALSE) +
  guides(shape = guide_legend(override.aes = list(color  = cols)))

P.S。图中绿色气泡周围出现红色笔划的原因是您还在旗帜后面绘制了 'var2' 。

reprex package (v0.3.0)

于 2020-04-08 创建