ggplot2中条形图的对称y轴限制

4

我想把柱状图的y轴设置为对称的,这样更容易看出正负变化的大小。否则有点失真。我已经有可行的代码了,尽管有些笨拙,但我认为如果我能直接在第一个ggplot()调用中完成这个操作就太好了。也就是说,ylim直接设置成对称的。

set.seed(123)
my.plot <- ggplot( data = data.table(x = 1:10,
                          y = rnorm(10,0, 2)), aes(x=x, y=y)) +
        geom_bar(stat="identity")

rangepull <- layer_scales(my.plot)$y
newrange <- max(abs(rangepull$range$range))
my.plot +
             ylim(newrange*-1, newrange)

我不是很理解你的问题。如果在调用ggplot()之前定义了数据集,那么就没有问题,但是你想在绘图函数内部定义数据吗?这真的有必要吗? - R18
这只是我的最小化工作示例的一部分,不是真正的问题。当然,数据也可以在之前生成。 - hannes101
1
所以,只需生成 data 对象,然后将代码 + ylim(1.05*(-max(abs(data$y))), 1.05*max(abs(data$y))) 添加到 ggplot() 中。 - R18
1
如果你担心没有一个漂亮的 mydata 对象可以使用(比如它是一个很长的管道链的终点),那么你可以使用像这样的语句:mystartingdata %>% some_dplyr_verbs(...) %>% {ggplot(data = .) + geom_col(aes(x=x, y=y)) + ylim(1.05*(-max(abs(.$y))), 1.05*max(abs(.$y)))}。花括号让你在整个 ggplot 调用中使用 . 代词。 - Brian
2个回答

1
这是什么意思:
library(ggplot2)
library(data.table)
set.seed(123)

my.data = data.table(x = 1:10, y = rnorm(10,0, 2))

my.plot <- ggplot(data = my.data)+aes(x=x, y=y) +
  geom_bar(stat="identity")+ylim((0-abs(max(my.data$y))),(0+max(abs(my.data$y))))

my.plot

如果我们只有正面记录怎么办?还有其他情况。这可能有效,也可能无效。 - M--
我进行了编辑(使用abs()函数),但如果您只有正数或负数,则会发现您的数据不对称?这不是问题吗? - MBnnn
但它可以嵌入代码中。好好想一想。 - M--
但是 ggplot 并不仅仅采用最大值或最小值来定义 y 轴的限制。因此,我正在提取这些值,如果我知道 ggplot 是如何定义它们的,我就可以直接使用这些值。 - hannes101
但是你想做什么呢?我认为ggplot默认会取最大值和最小值来制作y轴。我觉得我不明白你想做什么。 - MBnnn
@ggplot 考虑到扩展和最小/最大值。请看这个。抄送:MBnnn - M--

1
您可能想考虑使用ceiling
set.seed(123)
library(ggplot2)
library(data.table)

        dT <- data.table(x = 1:10, y = rnorm(10,0, 2))
        my.plot <- ggplot(dT, aes(x=x, y=y)) +
                   geom_bar(stat="identity") + 
                   ylim(-ceiling(max(abs(dT$y))), ceiling(max(abs(dT$y))))

这将给你:
 > my.plot
https://istack.dev59.com/rMMzl.webp

谢谢,虽然我认为 ceiling 命令没有任何区别。这种方法的问题之一是数据必须事先定义好。如果像在我的情况下它是 merge 的中间结果,那么使用我在初始帖子中使用的解决方案可能更容易。 - hannes101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接