从最小点开始对 1 轴上方和下方的 ggplot2 值进行对数缩放

问题描述 投票:0回答:2

我正在尝试使用 log10 标准化值从最低到最高值获取此条形图,以便所有值都存在。我遇到的问题是低于 1 的数字显示为 10^-负值,并且绘制的结果与高于 1 的值(10^正值)不同。

我发现的唯一解决方案是使用 geom_segment,但由于我的数据是结构化的,所以没有解决方案可以使用 x 位置的字符值来执行此操作。

如何让该图形以对数刻度显示从 0.0001 到 100 的值?

dt <- read.csv("data_median.csv")

# load ggplot2
library(ggplot2)
library(hrbrthemes)
library(tidyverse)
library(dplyr)
library(ggallin)
library(scales)

quantile_plot <- ggplot(dt, aes(x = Label, y = y, color = Type)) +
            geom_bar(stat = "identity") +
            labs(title = 'Contaminant_plot', y = 'ng/g Wet Weight') +
            scale_y_continuous(trans= 'log10') +
            theme(text = element_text(size = 10)) +
            scale_fill_brewer(palette = "Set1") + 
            coord_flip()

quantile_plot

#save to plots to disk
  ggsave("Contaminant_Plot.png", width = 45.5, height = 27.78, units = 'cm', dpi = 600)

r ggplot2 data-visualization
2个回答
2
投票

scales::pseudo_log_trans
在这里可能有用。它是一个使用带符号对数的变换函数,可以平滑过渡到零附近的线性。它允许您显示零值、负值以及对数刻度,否则您会使用
scale_x_log10

my_data <- data.frame(label = 1:11, y = 10^(-5:5))
my_data
  
library(ggplot2)
ggplot(my_data, aes(y, label)) +
  geom_col(orientation = "y") +
  scale_x_continuous(
    trans = scales::pseudo_log_trans(sigma = 0.000001), 
    breaks = 10^(-5:5))


0
投票

这里棘手的部分是,从数学上讲,它产生了完全正确的结果。您可以通过将每个值除以最小值来稍微改变它,以将“0”点设置为最小值,并使所有内容都面向正确的方向:

library(tidyverse)

df <- tibble(a = letters[1:15],
       b = 10^rnorm(15)) 

df |> 
  ggplot(aes(y = a, x = b)) +
  geom_bar(stat = "identity") +
  scale_x_log10()

... 变成:

df |> 
  mutate(trans_b = b/ min(b)) |> 
  ggplot(aes(y = a, x = trans_b)) +
  geom_bar(stat = "identity") +
  scale_x_log10()

当然,这只是给出了一个相对比例,例如“o 是 l 大小的 10 倍”。另一个解决方案是更改单位,使它们在缩放之前都高于 1:

  
df |> 
  mutate(trans_b = b*1000) |> 
  ggplot(aes(y = a, x = trans_b)) +
  geom_bar(stat = "identity") +
  scale_x_log10("B's per 1,000")

reprex 包于 2022 年 6 月 13 日创建(v2.0.1)

© www.soinside.com 2019 - 2024. All rights reserved.