首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gggplot2的scale_fill_gradient2中的动态中点

Gggplot2的scale_fill_gradient2中的动态中点
EN

Stack Overflow用户
提问于 2020-12-02 04:57:08
回答 1查看 232关注 0票数 0

我正在使用ggplot2在R中制作一个热图,并希望动态更改scale_fill_gradient2midpoint的值。我希望每一行的中点都是v1v2的最大值。

以下是原始曲线图和数据:

代码语言:javascript
运行
复制
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()

我试图通过取v1v2的最大值来改变中点,但这会影响所有行,而不是单独影响每行。

代码语言:javascript
运行
复制
scale_fill_gradient2(low = cbbPalette$pink, high = cbbPalette$green, mid = cbbPalette$grey,
                       midpoint = data[data$variable == "v1", "value"], space = "Lab",
                       name = title)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 05:42:37

比例并不是以这种方式工作的,因为它们将一系列的值映射到一组颜色。因此,特定的颜色表示整个图的特定值。我最好的建议是通过减去v1/v2的最大值来对数据进行预归一化。参见下面代码中的示例(在您的示例中有一些变量,但在我替换的共享代码中没有)。

代码语言:javascript
运行
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65098406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档