【发布时间】:2016-03-30 20:37:30
【问题描述】:
这实际上是两个问题合二为一(不确定是否违反 SO 规则,但无论如何)。
第一个问题是如何强制geom_text 适合geom_bar? (根据绘制的值动态)
环顾四周,我发现的解决方案是改变标签的大小。这当然有效,但并非适用于所有情况。您可以更改特定绘图的大小以使文本适合条形图,但是当数据更改时,您可能需要再次手动更改文本的大小。我的现实问题是我需要为不断变化的数据(每天)生成相同的图,所以我不能真正手动调整每个图的大小。
我尝试将标签的大小设置为数据的函数。它有点工作,但并不完美,但适用于许多情况。
但这里还有另一个问题,即使标签适合条形图,调整绘图大小也会使一切变得混乱。查了一下,我也在ggplot documentation那个
标签确实有高度和宽度,但它们是物理单位,而不是数据 单位。他们在该地块上占据的空间量在 数据单位:调整绘图大小时,标签保持相同大小,但 轴的大小发生变化。
这让我想到了我的第二个问题:是否可以更改此默认行为并让/使标签随情节调整大小?
还让我完善我的第一个问题。是否可以强制geom_text 适应geom_bar,使用物理单元和数据单元之间的巧妙关系动态设置文本大小?
因此,为了遵循良好的做法,这是我的可重现示例:
set.seed(1234567)
data_gd <- data.frame(x = letters[1:5],
y = runif(5, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2))
此代码生成此图:
如果我只是调整绘图的大小,“labels stay the same size, but the size of the axes changes”从而使标签适合条形(现在可能标签甚至太小了)。
所以,这是我的第二个问题。标签也可以调整大小并保持与条相关的纵横比会很好。任何想法如何实现这一点或是否有可能?
好的,但是回到如何在条形中放置标签,最简单的解决方案是设置标签的大小。
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2), size = 3)
同样,它的工作原理如下所示,但它不可维护/对数据的变化也不健壮。
例如,使用不同数据生成绘图的相同代码会产生灾难性的结果。
data_gd <- data.frame(x = letters[1:30],
y = runif(30, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2), size = 3)
我可以继续示例,将标签的大小设置为 x 轴上类别数量的函数,依此类推。但你明白了,也许你们中的一位ggplot2 专家可以给我一些想法。
【问题讨论】:
标签: r ggplot2 geom-bar geom-text ggproto