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 透明度?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)