geom_polygon 使用来自数据的十六进制填充颜色
geom_polygon with hex fill color from data
我有一个结构如下的小标题:
library(tidyverse)
dmd <- tibble(sample = rep(c(1,2,3), each = 2),
time = rep(c(1,2),3),
score = c(0.69,0.95,1,0.90,1,0.76)) %>%
mutate(x = map(base::strsplit(paste(sample,
sample + 0.5,
sample,
sample - 0.5,
sep = ","),
split = ","),
as.numeric)) %>%
mutate(y = map(base::strsplit(paste(time + 0.5,
time,
time - 0.5,
time,
sep = ","),
split = ","),
as.numeric)) %>%
unnest(c(x,y)) %>%
group_by(sample,time) %>%
mutate(group_id = cur_group_id()) %>%
ungroup
# A tibble: 24 × 6
sample time score x y group_id
<dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 1 1 0.69 1 1.5 1
2 1 1 0.69 1.5 1 1
3 1 1 0.69 1 0.5 1
4 1 1 0.69 0.5 1 1
5 1 2 0.95 1 2.5 2
6 1 2 0.95 1.5 2 2
7 1 2 0.95 1 1.5 2
8 1 2 0.95 0.5 2 2
9 2 1 1 2 1.5 3
10 2 1 1 2.5 1 3
# … with 14 more rows
然后我使用 grDevices::rgb
基于 score
生成灰度十六进制值 dcolor
。 if()
语句在这个例子中并没有做太多,但重要的是我保留这个元素以实现我的代码的功能化。
minsc <- min(dmd$score)
thrsh <- 0.75
if (minsc < thrsh) {
floor <- minsc
} else {
floor <- thrsh
}
dmd <- dmd %>% mutate(temp = (1 - score) / (1 - floor)) %>%
mutate(dcolor = grDevices::rgb(temp,temp,temp)) %>%
dplyr::select(-temp)
# A tibble: 24 × 7
sample time score x y group_id dcolor
<dbl> <dbl> <dbl> <dbl> <dbl> <int> <chr>
1 1 1 0.69 1 1.5 1 #FFFFFF
2 1 1 0.69 1.5 1 1 #FFFFFF
3 1 1 0.69 1 0.5 1 #FFFFFF
4 1 1 0.69 0.5 1 1 #FFFFFF
5 1 2 0.95 1 2.5 2 #292929
6 1 2 0.95 1.5 2 2 #292929
7 1 2 0.95 1 1.5 2 #292929
8 1 2 0.95 0.5 2 2 #292929
9 2 1 1 2 1.5 3 #000000
10 2 1 1 2.5 1 3 #000000
# … with 14 more rows
如果我用 geom_polygon
绘制 dmd
,dcolor
被解释为一个因子。
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
theme_void()
我想强制 ggplot
使用 dcolor
中给出的十六进制值作为每个菱形的填充颜色。使用 scale_fill_manual
让我更接近,但颜色仍然不正确(#000000
应该是黑色,#FFFFFF
应该是白色)。
pal <- dmd %>% dplyr::select(group_id, dcolor) %>%
unique %>% dplyr::select(dcolor) %>% as_vector
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
scale_fill_manual(values = palette(pal)) +
theme_void()
您可以使用 scale_fill_identity
达到您想要的结果:
library(tidyverse)
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
theme_void() +
scale_fill_identity(guide = guide_legend())
我有一个结构如下的小标题:
library(tidyverse)
dmd <- tibble(sample = rep(c(1,2,3), each = 2),
time = rep(c(1,2),3),
score = c(0.69,0.95,1,0.90,1,0.76)) %>%
mutate(x = map(base::strsplit(paste(sample,
sample + 0.5,
sample,
sample - 0.5,
sep = ","),
split = ","),
as.numeric)) %>%
mutate(y = map(base::strsplit(paste(time + 0.5,
time,
time - 0.5,
time,
sep = ","),
split = ","),
as.numeric)) %>%
unnest(c(x,y)) %>%
group_by(sample,time) %>%
mutate(group_id = cur_group_id()) %>%
ungroup
# A tibble: 24 × 6
sample time score x y group_id
<dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 1 1 0.69 1 1.5 1
2 1 1 0.69 1.5 1 1
3 1 1 0.69 1 0.5 1
4 1 1 0.69 0.5 1 1
5 1 2 0.95 1 2.5 2
6 1 2 0.95 1.5 2 2
7 1 2 0.95 1 1.5 2
8 1 2 0.95 0.5 2 2
9 2 1 1 2 1.5 3
10 2 1 1 2.5 1 3
# … with 14 more rows
然后我使用 grDevices::rgb
基于 score
生成灰度十六进制值 dcolor
。 if()
语句在这个例子中并没有做太多,但重要的是我保留这个元素以实现我的代码的功能化。
minsc <- min(dmd$score)
thrsh <- 0.75
if (minsc < thrsh) {
floor <- minsc
} else {
floor <- thrsh
}
dmd <- dmd %>% mutate(temp = (1 - score) / (1 - floor)) %>%
mutate(dcolor = grDevices::rgb(temp,temp,temp)) %>%
dplyr::select(-temp)
# A tibble: 24 × 7
sample time score x y group_id dcolor
<dbl> <dbl> <dbl> <dbl> <dbl> <int> <chr>
1 1 1 0.69 1 1.5 1 #FFFFFF
2 1 1 0.69 1.5 1 1 #FFFFFF
3 1 1 0.69 1 0.5 1 #FFFFFF
4 1 1 0.69 0.5 1 1 #FFFFFF
5 1 2 0.95 1 2.5 2 #292929
6 1 2 0.95 1.5 2 2 #292929
7 1 2 0.95 1 1.5 2 #292929
8 1 2 0.95 0.5 2 2 #292929
9 2 1 1 2 1.5 3 #000000
10 2 1 1 2.5 1 3 #000000
# … with 14 more rows
如果我用 geom_polygon
绘制 dmd
,dcolor
被解释为一个因子。
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
theme_void()
我想强制 ggplot
使用 dcolor
中给出的十六进制值作为每个菱形的填充颜色。使用 scale_fill_manual
让我更接近,但颜色仍然不正确(#000000
应该是黑色,#FFFFFF
应该是白色)。
pal <- dmd %>% dplyr::select(group_id, dcolor) %>%
unique %>% dplyr::select(dcolor) %>% as_vector
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
scale_fill_manual(values = palette(pal)) +
theme_void()
您可以使用 scale_fill_identity
达到您想要的结果:
library(tidyverse)
ggplot(dmd) +
geom_polygon(mapping = aes(x = x,
y = y,
group = group_id,
fill = dcolor),
color = "black") +
theme_void() +
scale_fill_identity(guide = guide_legend())