如何在R中创建热图

dxxyhpgq  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(131)

下面是一个数据集的例子:

structure(list(time = structure(c(19327, 19358, 19389, 19417, 
19448, 12053), class = "Date"), branques = c("index", "index", 
"index", "index", "index", "Indústries extractives"), values = c(-1.1, 
4, -1.6, 1.1, -6.5, 20)), row.names = c(252L, 253L, 254L, 255L, 
256L, 269L), class = "data.frame")

我想创建一个热图;所以x轴应该是2022年1月的time,y轴应该是branques(按字母顺序排列)。它应该用values填充,所以对于每个branques,它的数字越负,它应该越红,当它是正数时,它应该是绿色的。
它应该看起来像这样:

到目前为止,我试过:

ggplot(varIPI_branques_CAT_long, aes(x = time, y = branques, fill=values)) +
  geom_tile() +
  scale_x_date(expand=c(0,0), breaks = "2 months", labels=date_format("%b %y"),
               limits = c(as.Date("2022/01/01"), NA)) +
  scale_y_discrete(expand=c(0,0)) +
  labs( x = "% de variació interanual", 
        y = " ") +
  # Override default fill 
  scale_fill_distiller(type = "seq",
                       palette = "Reds",
                       limits = c(min(varIPI_branques_CAT_long$values), max(varIPI_branques_CAT_long$values)),
                       direction = 1,
                       na.value = "#FBF2F0")

我得到了这个:

但是,如何限制此Map的样本,使其仅使用2022年1月以后的值?而且,月与月之间不应该有间隔。

yruzcnhs

yruzcnhs1#

(1)对于发散调色板,取type = 'div'并选择发散调色板。我强烈建议反对红色/绿色,因为它对那些有红色/绿色色盲的人不友好。红色/蓝色可能是更好的选择。
如果你真的想要红色/绿色,你想使用scale_fill_gradient2,这是非常可定制的。
(2)我最初误解了这个问题。我认为这个问题是由每个月的天数变化引起的(差距发生在超过30天的月份)。因此,它需要一些技巧(以及brettjausn建议的预过滤)来修复。

library(ggplot)
library(scales)
library(tidyverse) # specifically requires dplyr (mutate) and forcats (fct_reorder)

df <- structure(list(time = structure(c(19327, 19358, 19389, 19417, 
                                        19448, 12053), class = "Date"), branques = c("index", "index", 
                                                                                     "index", "index", "index", "Indústries extractives"), values = c(-1.1, 
                                                                                                                                                      4, -1.6, 1.1, -6.5, 20)), row.names = c(252L, 253L, 254L, 255L, 
                                                                                                                                                                                              256L, 269L), class = "data.frame")

df |>
  mutate(
    date_char = format(time, "%b %y") |>
      factor() |>
      fct_reorder(time),
  ) |>
  mutate(
    scaled_value = scale(values),
    .by = branques
  ) |>
  filter(
    time >= as.Date("2022-01-01")
  ) |>
  ggplot(aes(x = date_char, y = branques, fill=scaled_value)) +
  geom_tile()+  # Make tile plot
  scale_x_discrete(
    expand=c(0,0),
    # date_breaks = "1 months", labels=date_format("%b%y"),
    # limits = c(as.Date("2023/01/01"), NA)) +
  ) +
  scale_y_discrete(expand=c(0,0)
  ) +
  labs( x = "% de variació interanual", 
        y = " ") +
  # Override default fill 
  scale_fill_gradient2(
    low = 'red',
    mid = "white",
    high = 'green',
    midpoint = 0, # default, switch if a different value is wanted
   limits = range(df$values)
  )

相关问题