气泡图中形状、颜色和图例与变量子集的匹配
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
我想将其绘制为气泡图,其中 id
按 var2
排序,气泡如下:
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"))
这给出了(在我的主题中)
但还有两个问题:
- 传说中的顺序怎么了?我遵循了 Two geom_points add a legend 中底部解决方案的配方,但不知何故顺序不匹配。
- 如何去掉绿色气泡周围的描边,为什么会有?
总的来说,匹配形状和颜色似乎出了点问题。
我承认,我花了一段时间才看懂你这有点绕的情节。原谅我,但我允许自己改变绘图方式,并使用(更好?)使用 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 创建
我有一些数据
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
中,"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"))
这给出了(在我的主题中)
但还有两个问题:
- 传说中的顺序怎么了?我遵循了 Two geom_points add a legend 中底部解决方案的配方,但不知何故顺序不匹配。
- 如何去掉绿色气泡周围的描边,为什么会有?
总的来说,匹配形状和颜色似乎出了点问题。
我承认,我花了一段时间才看懂你这有点绕的情节。原谅我,但我允许自己改变绘图方式,并使用(更好?)使用 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 创建