r-使用ggplot2的列明智热图

时间:2019-04-20 22:56:57

标签: r ggplot2

如果有人可以指导我应对以下挑战,我将不胜感激。

我正在尝试构建列明智的热图。对于每一列,我希望最小值为绿色,最大值为红色。当前的解决方案采用矩阵宽方法。

我在Heat map per column with ggplot2上看到了解决方案。如您所见,我实现了相同的代码,但没有得到想要的结果[下图]

enter image description here

df <- data.frame(
                     F1 = c(0.66610194649319, 0.666123551800434,
                            0.666100611954119, 0.665991102703081,
                            0.665979885730484),
            acc_of_pred = c(0.499541627510021, 0.49960260221954,
                            0.499646067768102, 0.499447308828986,
                            0.499379552967265),
   expected_mean_return = c(2.59756065316356e-07, 2.59799087404167e-07,
                            2.86466725381146e-07, 2.37977452007967e-07,
                            2.94242908573705e-07),
         win_loss_ratio = c(0.998168189343307, 0.998411671274781,
                            0.998585272507726, 0.997791676357902,
                            0.997521287688458),
           corr_pearson = c(0.00161443345430616, -0.00248811119331013,
                            -0.00203407575954095, -0.00496817102369628,
                            -0.000140531627184482),
          corr_spearman = c(0.00214838517340878, -0.000308343671725617,
                            0.00228492127281917, -0.000359577740835049,
                            0.000608090759428587),
                roc_vec = c(0.517972308828151, 0.51743161463546,
                            0.518033230192484, 0.518033294993802,
                            0.517931553535524)

)

combo <- data.frame(combo = c("baseline_120", "baseline_20",
                    "baseline_60", "baseline_288",
                    "baseline_5760"))

df.scaled <- scale(df)
df.scaled <- cbind(df.scaled,combo)

df.melt <- melt(df.scaled, id.vars = "combo")

ggplot(df.melt, aes(combo, variable)) + 
  geom_tile(aes(fill = value), colour = "white") + 
  scale_fill_gradient(low = "green", high = "red") +
  geom_text(aes(label=value)) + 
  theme_grey(base_size = 9) + 
  labs(x = "", y = "") + scale_x_discrete(expand = c(0, 0)) + 
  scale_y_discrete(expand = c(0, 0)) + 
  theme(legend.position = "none", axis.ticks = element_blank(), 
        axis.text.x = element_text(size = 9 * 0.8, 
                                   angle = 0, hjust = 0, colour = "grey50"))

1 个答案:

答案 0 :(得分:0)

您几乎是正确的。您实现的代码与绘图相同。但是问这个问题的人在数据准备中迈出了第一步,他添加了一个比例变量。

如果在绘制变量之前先对变量进行缩放并使用缩放因子作为填充参数,则它可以工作(我在计算变量后才在ggplot中的scale_fill_gradient中添加了重新缩放):

df.melt <- melt(df.scaled, id.vars = "combo")
df.melt<- ddply(df.melt, .(combo), transform, rescale = rescale(value))

ggplot(df.melt, aes(combo, variable)) + 
  geom_tile(aes(fill = rescale), colour = "white") + 
  scale_fill_gradient( low= "green", high = "red") +
  geom_text(aes(label=round(value,4))) + 
  theme_grey(base_size = 9) + 
  labs(x = "", y = "") + scale_x_discrete(expand = c(0, 0)) + 
  scale_y_discrete(expand = c(0, 0)) + 
  theme(legend.position = "none", axis.ticks = element_blank(), 
        axis.text.x = element_text(size = 9 * 0.8, 
                                   angle = 0, hjust = 0, colour = "grey50"))

给出情节:

solution plot