具有因子水平的双色热图

Chr*_*ris 2 r ggplot2 dplyr tidyverse

我有这个数据框:

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

我希望绘制一个热图,其中 id 在 X 轴上,年在 Y 轴上,当数据点存在时颜色为蓝色,当数据不存在时颜色为红色。我快到了,但我不知道要更改两种颜色的填充参数:

ggplot(df, aes(id, year, fill= year)) + 
  geom_tile()
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

  • 如何在geom_tile()不弄乱它的情况下添加 alpha 透明度?
  • 我需要从最大缺失到最小缺失对 id 进行排序。

Phi*_*hil 5

complete()tidyr 包中的函数可用于填充缺失的组合。首先,您需要设置一个标志变量来指示数据是否存在,然后用缺失的组合展开数据框,并用0填充新的标志变量:

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

ggplot(df, aes(id, year, fill = flag)) + 
  geom_tile()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 EDIT1:要添加透明度,请在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))
Run Code Online (Sandbox Code Playgroud)