使用 scale_fill_gradientn 将特定颜色分配给条形图中的确定值
Assign specific color to definite value in bar plot using scale_fill_gradientn
我有一个庞大的数据集,其中包含 20 名患者的某些参数的逐分钟记录。
通过可视化患者监测记录(IP 参数),我试图构建彩色条形图。
所以我在r中使用了scale_fill_gradient()
函数。
问题是,我想为一个确定的值(例如 IP = 20)分配一个特殊的颜色(比如说白色)。
scale_fill_gradient 可以吗?
我的数据库是这样的:
Patient min IP
1a 75 19
1a 76 21
1a 77 20
1a 78 18.5
1a 79 17
1a 80 25
1a 81 29.3
1a 82 32.1
1a 83 30.9
2c 1 2
2c 2 5
2c 3 8
2c 4 9
2c 5 12
2c 6 16
2c 7 18
3v 72 38
3v 73 35
3v 74 30.3
3v 75 28.7
3v 76 27
3v 77 25.2
3v 78 22
3v 79 19.1
3v 80 18
3v 81 15
我的代码是
i<- ggplot(data, aes(patient, IP, fill=IP))
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c", "#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
i+geom_bar(stat = "identity")+ scale_fill_gradientn(colours = IPcol)+ coord_flip()+scale_y_time()
从这段代码中我得到了下图:
所以我唯一想改变的是 IP = 20 应该是白色的
所以简单的选择是将等于 20s 的 IP
s 重新编码为 NA
s 并在该比例中设置 na.value
:
data <- read.table(text = your_posted_data, header = T)
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c",
"#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
ggplot(data, aes(Patient, IP, fill= ifelse(IP != 20, IP, NA))) +
geom_col() +
scale_fill_gradientn(colours = IPcol, na.value = "white")+
coord_flip()+
scale_y_time()
如果你想要困难的选项,你必须编写一个适用于 0-1 范围内值的调色板函数,并将重新缩放的 20 设置为白色:
# Define an area to set to white
target <- (c(19.5, 20.5) - min(data$IP)) / (max(data$IP) - min(data$IP))
# Build a palette function
my_palette <- function(colours, values = NULL) {
ramp <- scales::colour_ramp(colours)
force(values)
function(x) {
# Decide what values to replace
replace <- x > target[1] & x < target[2]
if (length(x) == 0)
return(character())
if (!is.null(values)) {
xs <- seq(0, 1, length.out = length(values))
f <- stats::approxfun(values, xs)
x <- f(x)
}
out <- ramp(x)
# Actually replace values
out[replace] <- "white"
out
}
}
现在你可以这样绘制它了:
ggplot(data, aes(Patient, IP, fill= IP)) +
geom_col() +
continuous_scale("fill", "my_pal", my_palette(IPcol),
guide = guide_colourbar(nbin = 100))+
coord_flip()+
scale_y_time()
我有一个庞大的数据集,其中包含 20 名患者的某些参数的逐分钟记录。
通过可视化患者监测记录(IP 参数),我试图构建彩色条形图。
所以我在r中使用了scale_fill_gradient()
函数。
问题是,我想为一个确定的值(例如 IP = 20)分配一个特殊的颜色(比如说白色)。 scale_fill_gradient 可以吗?
我的数据库是这样的:
Patient min IP
1a 75 19
1a 76 21
1a 77 20
1a 78 18.5
1a 79 17
1a 80 25
1a 81 29.3
1a 82 32.1
1a 83 30.9
2c 1 2
2c 2 5
2c 3 8
2c 4 9
2c 5 12
2c 6 16
2c 7 18
3v 72 38
3v 73 35
3v 74 30.3
3v 75 28.7
3v 76 27
3v 77 25.2
3v 78 22
3v 79 19.1
3v 80 18
3v 81 15
我的代码是
i<- ggplot(data, aes(patient, IP, fill=IP))
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c", "#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
i+geom_bar(stat = "identity")+ scale_fill_gradientn(colours = IPcol)+ coord_flip()+scale_y_time()
从这段代码中我得到了下图:
所以我唯一想改变的是 IP = 20 应该是白色的
所以简单的选择是将等于 20s 的 IP
s 重新编码为 NA
s 并在该比例中设置 na.value
:
data <- read.table(text = your_posted_data, header = T)
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c",
"#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
ggplot(data, aes(Patient, IP, fill= ifelse(IP != 20, IP, NA))) +
geom_col() +
scale_fill_gradientn(colours = IPcol, na.value = "white")+
coord_flip()+
scale_y_time()
如果你想要困难的选项,你必须编写一个适用于 0-1 范围内值的调色板函数,并将重新缩放的 20 设置为白色:
# Define an area to set to white
target <- (c(19.5, 20.5) - min(data$IP)) / (max(data$IP) - min(data$IP))
# Build a palette function
my_palette <- function(colours, values = NULL) {
ramp <- scales::colour_ramp(colours)
force(values)
function(x) {
# Decide what values to replace
replace <- x > target[1] & x < target[2]
if (length(x) == 0)
return(character())
if (!is.null(values)) {
xs <- seq(0, 1, length.out = length(values))
f <- stats::approxfun(values, xs)
x <- f(x)
}
out <- ramp(x)
# Actually replace values
out[replace] <- "white"
out
}
}
现在你可以这样绘制它了:
ggplot(data, aes(Patient, IP, fill= IP)) +
geom_col() +
continuous_scale("fill", "my_pal", my_palette(IPcol),
guide = guide_colourbar(nbin = 100))+
coord_flip()+
scale_y_time()