Вы можете получить шестнадцатеричные значения, следующие за градиентом colorbar
в ggplot
следующим образом:
gg_build () решение
set.seed(1)
data <- data.frame("a"=runif(100),"b"=runif(100))
mean_a <- mean(data$a)
p1 <- ggplot(data)+
geom_point(aes(x=a,
y=b,
color=a),
stat="identity")+
scale_color_gradientn(
colors=c("red","black","green"),
values=c(0, mean_a, 1))+
theme(legend.position = NULL)
# get plot build
build <- ggplot_build(p1)
# select hex value and x-value data
hex_df <- build$data[[1]][, c("colour", "x")]
# order hex value data to follow x-axis
hex_df_ordered <- hex_df[order(hex_df$x),]
масштаб :: градиент_n_pal () решение
Возможно, вам нужен подход, использующий пакетную функцию scales
gradient_n_pal
, которая вызывается scale_color_gradientn
:
library(ggplot2)
library(scales)
library(ggpubr)
# create data
set.seed(1)
data <- data.frame("a"=runif(100), "b"=runif(100))
#get mean_a
mean_a <- mean(data$a)
# order the data by a
data <- data[order(data$a),]
# encode the values in a character variable for reference
data$a_char <- as.character(data$a)
# use the scales::gradient_n_pal to create a palette function
pal <- scales::gradient_n_pal(colours = c("red","black","green"),
values= c(0, mean_a, 1))
# use data in a to generate palette-generated values in the data
data$hex_from_scales <- pal(data$a)
# plot with scale_color_gradientn
p1 <- ggplot(data)+
geom_point(aes(x=a,
y=b,
color=a),
stat="identity", show.legend = F)+
scale_color_gradientn(colors=c("red","black","green"),values=c(0, mean_a, 1))+
ggtitle("Using scale_color_gradientn ")+
theme(legend.position = NULL)
# plot with scale_color_manual and gradient_n_pal generated hex values
p2 <- ggplot(data)+
geom_point(aes(x=a,
y=b,
color=a_char),
stat="identity", show.legend = F)+
scale_color_manual(values = data$hex_from_scales)+
ggtitle("Using gradient_n_pal")+
theme(legend.position = NULL)
plots <- ggpubr::ggarrange(p1, p2, ncol = 2)
Этот код генерирует эти графики:
Заключение
Судя по сходству на двух графиках кажется, что вы можете получить шестнадцатеричные значения вашего вектора цифр c с помощью этого фрагмента:
# create a palette function
pal <- scales::gradient_n_pal(colours = c("red","black","green"),values= c(0, mean_a, 1))
# get palette-generated values from your vector
data$hex_from_scales <- pal(data$a)
Также примечательно, что это решение генерирует немного другого гекса коды как ggplot_build()
решение, предложенное выше. Мои глаза говорят мне, что различия незначительны. Пока не увижу, не поверю!