R ggplot2和x27中的动态中点;s比例填充梯度2

R ggplot2和x27中的动态中点;s比例填充梯度2,r,ggplot2,data-visualization,heatmap,R,Ggplot2,Data Visualization,Heatmap,我正在使用ggplot2在R中绘制热图,我想动态更改比例填充梯度2的中点的值。我希望每行的中点是v1和v2的最大值 以下是原始图和数据: library(ggplot2) set.seed(1L) s = sprintf("d%s", 1:9) vars = sprintf("v%s", 1:6) data = data.frame(s = rep(s, 6), stringsAsFactors = FALSE) data$variable = rep(

我正在使用ggplot2在R中绘制热图,我想动态更改
比例填充梯度2
中点的值。我希望每行的中点是
v1
v2
的最大值

以下是原始图和数据:

library(ggplot2)
set.seed(1L)

s = sprintf("d%s", 1:9)
vars = sprintf("v%s", 1:6)
data = data.frame(s = rep(s, 6), stringsAsFactors = FALSE)
data$variable = rep(vars, rep.int(9, 6))
data$variable = as.factor(data$variable)
data$value = round(runif(54, min=-100, max=100), 1)

pdf(save)
heatmap = ggplot(data = data, aes(x = variable, y = s, fill = value)) +
  geom_tile(color = "black", aes(width = 1)) +
  scale_fill_gradient2(low = cbbPalette$pink, high = cbbPalette$green, mid = cbbPalette$grey,
                       midpoint = 0, space = "Lab",
                       name = title) +
  scale_color_discrete("exps", data$variable) +
  theme_minimal() +
  theme(axis.text.x = element_text(vjust = 1,
                                   size = title.size), legend.title = element_blank(),
        axis.text.y = element_text(size = title.size),
        strip.text.x = element_text(size = title.size)) +
  coord_fixed()

#add numbers to cells
heatmap = heatmap + geom_text(aes(x = variable, y = s, label = value), color = cbbPalette$black, size = 3) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank(),
    axis.ticks = element_blank(),
    legend.justification = c(0.5, 0),
    legend.direction = "horizontal",
    legend.position = "top") + 
  guides(fill = guide_colorbar(barwidth = 7, barheight = 1,
                               title.position = "top", title.hjust = 0.5))
# Print the heatmap
print(heatmap)
dev.off()
我试图通过取
v1
v2
的最大值来改变中点,但这会影响所有行,而不是单独影响每行

scale_fill_gradient2(low = cbbPalette$pink, high = cbbPalette$green, mid = cbbPalette$grey,
                       midpoint = data[data$variable == "v1", "value"], space = "Lab",
                       name = title)

比例实际上不是这样工作的,因为它们将一系列值映射到一组颜色。因此,特定的颜色意味着整个绘图的特定值。我最好的建议是通过减去v1/v2的最大值来对数据进行预标准化。请参阅下面代码中的示例(在您的示例中有一些变量,但在我替代的共享代码中没有)

库(ggplot2)
图书馆(tidyverse)
结实种子(1L)
s=sprintf(“d%s”,1:9)
vars=sprintf(“v%s”,1:6)
data=data.frame(s=rep(s,6),stringsAsFactors=FALSE)
数据$variable=rep(变量,rep.int(9,6))
数据$variable=as.factor(数据$variable)
数据$value=round(runif(54,min=-100,max=100),1)
新数据%group\U由%>%
变异(值=值-最大值(值[变量%c(“v1”、“v2”)]))
ggplot(数据=新数据,aes(x=变量,y=s,填充=值))+
geom_瓷砖(颜色=“黑色”,aes(宽度=1))+
比例填充梯度2(低=“粉红”,高=“绿色”,中=“灰色”,
中点=0,空格=“实验室”,
name=“title”)+
比例\颜色\离散(“exps”,数据$变量)+
主题_极小值()+
固定坐标

在绘制数据之前,您可能只需按行绘制数据
library(ggplot2)
library(tidyverse)

set.seed(1L)

s = sprintf("d%s", 1:9)
vars = sprintf("v%s", 1:6)
data = data.frame(s = rep(s, 6), stringsAsFactors = FALSE)
data$variable = rep(vars, rep.int(9, 6))
data$variable = as.factor(data$variable)
data$value = round(runif(54, min=-100, max=100), 1)

new_data <- data %>% group_by(s) %>%
  mutate(value = value - max(value[variable %in% c("v1", "v2")]))

ggplot(data = new_data, aes(x = variable, y = s, fill = value)) +
  geom_tile(color = "black", aes(width = 1)) +
  scale_fill_gradient2(low = "pink", high = "green", mid = "grey",
                       midpoint = 0, space = "Lab",
                       name = "title") +
  scale_color_discrete("exps", data$variable) +
  theme_minimal() +
  coord_fixed()