使用 geom_tile 时如何控制 ggplot2 中分类数据的 y 轴刻度?
How can I control the y-axis scale for categorical data in ggplot2 when using geom_tile?
我正在尝试在 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)
)
...我明白了...
问题是文本很小,因为我发现阻止标签重叠或看起来拥挤的唯一方法是我不得不减小文本大小。
如果我将 coord_fixed 比率更改为 2,那么 ggplot 不会拉长 y 轴,而是像这样挤压 x 轴...
我试过使用 theme(aspect_ratio) 而不是 coord_fixed,这似乎没有什么区别。我也试过设置块输出参数(out.height 和 fig.height),但它们似乎也没有任何区别。
我怎样才能得到一个具有足够垂直高度的图,这样标签就可以在网页上阅读而不会使 x 轴被压扁?
tl;dr:答案是使用 fig.height 和 fig.width 并确保同时设置它们。
更多详情
在@Jon Spring 上面的评论的推动下,我找到了答案。将其张贴在这里以防将来对人们有所帮助。在我之前对 zevross.com 文章中描述的块选项的探索中,我犯了两个错误。
首先,我使用了 out.height/out.width 以像素为单位指定输出。这并不是我可以预测的方式 - 将高度从 800px 更改为 1600px 并没有使针织 HTML 页面中显示的图像大小加倍。一旦达到某个阈值(可能由所有笔记本内容所在的容器 div 的宽度决定),然后增加 out 的值。height/width 没有区别。
我对 zevross 文章的阅读(可能是错误的)是这样的。height/width 就像一个更灵活的 fig.height/width 版本,适用于数字和图像。这在某种程度上是正确的,但我认为它基本上充当了一个比例因子。如果问题是,就像我的情况一样,canvas 纵横比是错误的,那么一旦它达到容器的最大宽度 div 就没有任何用处。
当我切换到使用 fig.height 和 fig.width 时,绘图 canvas 大小开始改变,我可以消除绘图两边毫无意义的空白,因此绘图在生成的 HTML 文档中开始显示得更大。
我在之前的实验中犯的另一个错误是只设置了一个参数。我的想法是我只关心一个维度(在本例中为高度),因此内容可以决定宽度。仅设置高度意味着没有任何改变。您必须更改高度和宽度。
我正在尝试在 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)
)
...我明白了...
如果我将 coord_fixed 比率更改为 2,那么 ggplot 不会拉长 y 轴,而是像这样挤压 x 轴...
我试过使用 theme(aspect_ratio) 而不是 coord_fixed,这似乎没有什么区别。我也试过设置块输出参数(out.height 和 fig.height),但它们似乎也没有任何区别。
我怎样才能得到一个具有足够垂直高度的图,这样标签就可以在网页上阅读而不会使 x 轴被压扁?
tl;dr:答案是使用 fig.height 和 fig.width 并确保同时设置它们。
更多详情
在@Jon Spring 上面的评论的推动下,我找到了答案。将其张贴在这里以防将来对人们有所帮助。在我之前对 zevross.com 文章中描述的块选项的探索中,我犯了两个错误。
首先,我使用了 out.height/out.width 以像素为单位指定输出。这并不是我可以预测的方式 - 将高度从 800px 更改为 1600px 并没有使针织 HTML 页面中显示的图像大小加倍。一旦达到某个阈值(可能由所有笔记本内容所在的容器 div 的宽度决定),然后增加 out 的值。height/width 没有区别。
我对 zevross 文章的阅读(可能是错误的)是这样的。height/width 就像一个更灵活的 fig.height/width 版本,适用于数字和图像。这在某种程度上是正确的,但我认为它基本上充当了一个比例因子。如果问题是,就像我的情况一样,canvas 纵横比是错误的,那么一旦它达到容器的最大宽度 div 就没有任何用处。
当我切换到使用 fig.height 和 fig.width 时,绘图 canvas 大小开始改变,我可以消除绘图两边毫无意义的空白,因此绘图在生成的 HTML 文档中开始显示得更大。
我在之前的实验中犯的另一个错误是只设置了一个参数。我的想法是我只关心一个维度(在本例中为高度),因此内容可以决定宽度。仅设置高度意味着没有任何改变。您必须更改高度和宽度。