R语言 对数缩放ggplot2值高于和低于从最小点开始的1轴

prdp8dxp  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(92)

我试图得到这个条形图,从最低到最高的log 10标准化值,所以所有的值都存在。我遇到的问题是小于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)

字符串
x1c 0d1x的数据

nbewdwxp

nbewdwxp1#

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))

字符串


的数据

lmyy7pcs

lmyy7pcs2#

这里的棘手之处在于,从数学上讲,它产生的是完全正确的东西。您可以通过将每个值除以最小值来将“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 package(v2.0.1)于2022-06-13创建

相关问题