55

我有一个非常简单的问题,让我把头撞在墙上。

我想缩放直方图的 y 轴以反映每个 bin 组成的比例(0 到 1),而不是像使用 y=..density.. 那样让条形的面积总和为 1,或将最高条设为 1,就像 y=..ncount.. 一样。

我的输入是名称和值的列表,格式如下:

name    value
A   0.0000354
B   0.00768
C   0.00309
D   0.000123

我失败的尝试之一:

library(ggplot2)
mydataframe < read.delim(mydata)
ggplot(mydataframe, aes(x = value)) +
geom_histogram(aes(x=value,y=..density..))

这给了我一个面积为 1,但高度为 2000 和 1000 的直方图:

尝试

并且 y=..ncount.. 给了我一个最高柱状图 1.0 的直方图,并按比例缩放到它:

尝试

但我想让第一个条的高度为 0.5,另外两个为 0.25。

R 也不承认 scale_y_continuous 的这些用途。

scale_y_continuous(formatter="percent")
scale_y_continuous(labels = percent)
scale_y_continuous(expand=c(1/(nrow(mydataframe)-1),0)

感谢您的任何帮助。

4

5 回答 5

79

请注意,重新缩放..ncount..到最大值 1.0,而..count..是未缩放的 bin 计数。

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../sum(..count..)))

这使:

在此处输入图像描述

于 2012-08-01T20:34:18.920 回答
31

从最新最好的 ggplot2 版本 3.0.0 开始,格式发生了变化。现在您可以将y值包装起来stat()而不是弄乱..东西。

ggplot(mydataframe, aes(x = value)) +
  geom_histogram(aes(y = stat(count / sum(count))))
于 2018-08-14T23:07:53.203 回答
22

从 ggplot2 0.9 开始,许多格式化程序函数已移至 scales 包,包括percent_format().

library(ggplot2)
library(scales)

mydataframe <- data.frame(name = c("A", "B", "C", "D"),
                          value = c(0.0000354, 0.00768, 0.00309, 0.000123))

ggplot(mydataframe) + 
  geom_histogram(aes(x = value, y = ..ncount..)) +
  scale_y_continuous(labels = percent_format())
于 2012-08-01T20:37:15.493 回答
0

总结以上答案:

library(tidyverse)

mydataframe <- data.frame(name = c("A", "B", "C", "D"),
                          value = c(0.0000354, 0.00768, 0.00309, 0.000123))

ggplot(mydataframe, aes(x = value)) +
  geom_histogram(aes(y = stat(count / sum(count)))) +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(x="", y="")

在此处输入图像描述

于 2021-08-11T15:20:14.743 回答
0

我只是想缩放轴,将 y 轴除以 1000,所以我做了:

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../1000))
于 2020-07-16T16:00:50.797 回答