我正在尝试使用 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)
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”点设置为最小值,并使所有内容都面向正确的方向:
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)