使用geom_tile时,如何控制ggplot2中类别数据的y轴比例?

时间:2019-06-16 22:55:52

标签: r ggplot2 heatmap

我正在尝试使用RMarkdown文档中的ggplot制作热图。预期的输出是html页面。我的输入数据帧(npBasicLong)看起来像这样:

location    hh    medianEWS
--------    --    ---------
Alpha       1     2
Alpha       2     1
Alpha       3     3
Alpha       4     1
...(and so on)
Alpha       23    3
Beta        1     4
Beta        2     4
Beta        3     1

使用以下代码...

ggplot(data = npBasicLong) +
  aes(x = hh) +
  aes(y = fct_rev(location)) + #fct_rev is used as a hack to reverse the ordering of the wards
  aes(fill = medianEWS) +
  geom_tile(colour = "white") +
  scale_fill_gradient2(name = 'Median\nNEWS\nScore', low = "#7cbc12", mid = "gold", high = "red", midpoint = 3) +
  geom_text (aes
             (label = medianEWS),
             size = 1.5) +
  scale_x_continuous('Hour',
                     expand = c(0, 0),
                     breaks = seq(0,24,1),
                     position = "top") +
  coord_fixed(ratio = 1) +
  theme(panel.grid.minor=element_blank(),
        panel.grid.major=element_blank(),
        axis.ticks = element_blank(),
        axis.title.y = element_blank(),
        text = element_text (size=8)
        )

...我明白了...

geom_tile heatmap 问题在于文本很小,因为我发现停止标签重叠或显得拥挤的唯一方法是必须减小文本大小。

如果我将coord_fixed的比例更改为2,那么与其像拉长y轴ggplot那样,不如像这样挤压x轴...

Squashed heatmap

我尝试使用theme(aspect_ratio)而不是coord_fixed,但这似乎没有什么区别。我也尝试设置块输出参数(out.height和fig.height),但它们似乎也没有任何区别。

我怎么能得到一个垂直高度足够高的图,从而可以在不使x轴压缩的情况下在网页上读取标签?

1 个答案:

答案 0 :(得分:0)

tl; dr:答案是使用fig.height和fig.width并确保同时设置它们。


更多细节

在上面@Jon Spring的评论的鼓励下,我找到了答案。张贴在这里,以防将来对人们有帮助。在我以前对zevross.com文章中介绍的块选项的探索中,我犯了两个错误。

首先,我使用out.height / out.width以px为单位指定输出。这并不是我可以预测的方式-将高度从800px更改为1600px不会使编织的HTML页面中显示的图像大小增加一倍。一旦我达到某个阈值(可能由所有笔记本内容所在的容器div的宽度确定),然后增加out.height / width的值就没有任何区别。

我对zevross文章的阅读(可能是错误的)是out.height / width类似于fig.height / width的更灵活的版本,适用于图形和图像。这是正确的,但我认为它基本上是缩放因子。如果问题是(例如我的情况),画布的宽高比是错误的,那么一旦它达到容器div的最大宽度,就不会有任何有用的事情。

当我切换为使用fig.height和fig.width时,绘图画布的大小开始改变,我可以消除绘图两侧的无意义空白,因此绘图在生成的HTML中开始显示得更大文档。

我在先前的实验中犯的另一个错误是仅设置一个参数。我的想法是,我只关心一个维度(在这种情况下为高度),因此内容可以确定宽度。仅设置高度意味着什么都没有改变。您必须同时更改高度和宽度。