1

我有一些数据

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

我想将其绘制为按id排序的气泡图var2,气泡如下:ID A 和 B:var1绘制在size1“空气泡”中,并用“填充”气泡var2绘制。size2ID C 被标记是因为只有一个值(这就是为什么var1=var2)并且它应该有一个不同颜色的“填充气泡”。

我已经尝试如下:

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. 传说中的顺序怎么了?我遵循了两个 geom_points 添加图例中的底部解决方案的配方,但不知何故顺序不匹配。
  2. 如何摆脱绿色气泡周围的中风,为什么会出现?

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

4

1 回答 1

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)))

PS在你的情节中绿色气泡周围出现红色中风的原因是你还在你的旗帜后面绘制了'var2'。

reprex 包(v0.3.0)于 2020 年 4 月 8 日创建

于 2020-04-08T09:16:02.077 回答