具有因子水平的双色热图

我有这个数据框:

set.seed(0)
df <- data.frame(id = factor(sample(1:100,10000,replace=TRUE),levels=1:100),year = factor(sample(1950:2019,levels=1950:2019)) %>% unique() %>% arrange(id,year)

我正在寻找一个热图图,其中id在X轴上,年份在Y轴上,当数据点存在时颜色为蓝色,而当数据不存在时颜色为红色。不存在。我快到了,但是我想不起来更改两种颜色的填充参数:

ggplot(df,aes(id,year,fill= year)) + 
  geom_tile()

将两个变量都绘制为因子的目的是即使在某年没有任何id时也将它们绘制(并将其整个行绘制为红色)。

编辑

我忘了补充两件事(希望还不算太晚):

  • 如何在不弄乱透明度的情况下向geom_tile()添加Alpha透明度?
  • 我需要将ID从最大缺失到最小缺失排序。
msch0628bb 回答:具有因子水平的双色热图

tidyr软件包中的complete()函数对于填写缺失的组合很有用。首先,您需要设置一个标志变量以指示是否存在数据,然后使用缺少的组合扩展数据框,并用0填充新的标志变量:

df <- df %>% 
  mutate(flag = TRUE) %>% 
  complete(id,year,fill = list(flag = FALSE))

ggplot(df,aes(id,fill = flag)) + 
  geom_tile()

enter image description here 编辑1:要添加透明度,请在alpha = 0.x中添加geom_tile(),其中x是指示透明度的值。值越低,越透明。

EDIT2:要按缺失排序,请在ggplot代码之前添加以下代码:

# Determine the order of the IDs
df_order <- df %>% 
  group_by(id) %>% 
  summarize(sum = sum(flag)) %>% 
  arrange(desc(sum)) %>% 
  mutate(order = row_number()) %>% 
  select(id,order)

# Set the IDs in order on the chart
df <- df %>% 
  left_join(df_order) %>% 
  mutate(id = fct_reorder(id,order))
,

我认为您需要在绘制之前进行一些预处理。创建一个临时变量(data_exist),该临时变量表​​示该idyear的数据存在。然后使用complete为每个years填充丢失的id并将其绘制出来。

library(tidyverse)
df %>%
   mutate_all(~as.integer(as.character(.))) %>%
   mutate(data_exist = 1) %>%
   complete(id,year = min(year):max(year),fill = list(data_exist = 0)) %>%
   mutate(data_exist = factor(data_exist)) %>%
   ggplot() + aes(id,fill= data_exist) + geom_tile()

enter image description here

,

使用expand.grid,您可以创建一个包含ID和年份的所有组合的数据框,然后对这些组合进行左连接以查看您是否在df中有它们

  all <- expand.grid(id=levels(df$id),year=levels(df$year)) %>% 
              left_join(df) %>% 
              mutate(present=ifelse(is.na(present),'0','1'))
   ggplot(all,aes(as.numeric(id),as.numeric(year),fill= present)) + 
            geom_tile() + 
            scale_fill_manual(values=c('0'='red','1'='blue')) + # change default colors
            theme(legend.position="None") # hide legend

enter image description here

本文链接:https://www.f2er.com/3112490.html

大家都在问