R 如何使直方图的y轴同时具有对数和百分比?

R 如何使直方图的y轴同时具有对数和百分比?,r,ggplot2,data-visualization,scale,yaxis,R,Ggplot2,Data Visualization,Scale,Yaxis,我试图在ggplot2中绘制一个柱状图,并且我试图使y轴同时具有对数和显示百分比,以获得0.1%、1%、10%等 我的数据集是60000个样本,但我希望这种数据集能够捕捉到它: -0.0651 -0.0649 -0.0661 -0.0652 -0.058 -0.045 -0.022 -0.001 +0.028 +0.039 -0.022 -0.0651 -0.0652 我可以独立完成这两件事

我试图在
ggplot2
中绘制一个柱状图,并且我试图使y轴同时具有对数和显示百分比,以获得0.1%、1%、10%等

我的数据集是60000个样本,但我希望这种数据集能够捕捉到它:

    -0.0651
    -0.0649
    -0.0661
    -0.0652
    -0.058
    -0.045
    -0.022
    -0.001
    +0.028
    +0.039
    -0.022
    -0.0651
    -0.0652
我可以独立完成这两件事(1制作y轴日志,1制作百分比)。因此,当我只计算百分比时,我使用以下代码:

ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +
ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +
  scale_y_continuous(trans = 'log10')
我得到这个输出,上面有百分比:

但是我现在想让y轴是对数的。当我按照我被教导的方式,使用以下代码:

ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +
ggplot(aphist, aes(aphist$baseline1CW_Vm_samp)) +
  geom_histogram(aes(y = (..count..)/sum(..count..)), binwidth=0.0008) +
  scale_y_continuous(trans = 'log10')
我突然发现了一个非常奇怪的颠倒的情节:

我怀疑这是因为有一些样本是0或接近0,但我不确定。任何帮助都将不胜感激

为什么横杆指向下方以及如何处理 创建
ggplot
中的条形图时,正值的条形图从y=0开始指向上方,而负值的条形图从同一轴指向下方。您正在y轴上显示密度,y轴的定义介于0和1之间。该范围内的数字的对数为负数,因此所有条形图都指向下方

ggplot(faithful, aes(waiting)) +
  geom_histogram(aes(y = stat(density)), binwidth = 2) +
  scale_y_log10()
我不知道有什么方法可以让
ggplot
自动执行您想要的操作。但是,可以通过绘制计数而不是密度来实现目标。这将起作用,因为计数为1或更大,这意味着对数为正。当然,计数为0时除外。0的对数发散,这些值不会被绘制,这相当于绘制高度为零的条形图

一个简单的例子 因为我没有您的数据,所以我将使用内置数据集
fidelity
展示一个解决方案。它应该很容易适应您的数据

为了证明我的意思,我首先给你们看一个例子,其中y轴不是对数的。这样做的优点是,无需任何技巧即可轻松创建绘图:

bw <- 2
n <- nrow(faithful)
ggplot(faithful, aes(waiting)) +
  geom_histogram(aes(y = stat(density)), binwidth = bw)
请注意,这次我绘制的是计数,而不是密度。但是,我使用
scale\u y\u continuous()
中的参数
breaks
labels
来重新定义断点及其标签的位置,使其显示密度

对数y轴解 同样的原理也适用于对数图。首先,我以与您相同的方式创建日志图,这样您就可以看到我最终遇到了相同的问题:条形图指向下方

ggplot(faithful, aes(waiting)) +
  geom_histogram(aes(y = stat(density)), binwidth = 2) +
  scale_y_log10()

但通过绘制计数和重新定义标签,可以获得更合适的图像:

ggplot(faithful, aes(waiting)) +
  geom_histogram(binwidth = bw) +
  scale_y_log10(
    breaks = seq(0, 0.05, 0.01) * (bw * n),
    labels = function(x) x / (bw * nrow(faithful))
  )

在ggplot中,正值条向上绘制,负值条向下绘制。因为您正在绘制密度,所以您的所有值都在0和1之间,并且0和1之间的数字的对数是负数。@Stibu这解释了很多,非常感谢!有没有办法使数值正确显示在对数百分比轴上,如10^-3%、1%、10%等。?直觉上,为了达到这个目的,我应该先进行日志转换,然后以某种方式计算百分比,但我无法计算出来。非常感谢您的详细解释,您帮助我完成了加载!!!:)