Как установить оси x в том же масштабе после преобразования журнала с помощью ggplot

#r #ggplot2 #histogram #axes

Вопрос:

Я уже несколько недель пытаюсь решить, казалось бы, простую проблему, рисуя две независимые гистограммы с помощью ggplot. Поскольку данные не соответствуют нормальному распределению, я преобразую их в журнал. Но тогда я не в состоянии масштабировать, установить ось X независимых графиков, чтобы показать точно такой же масштаб.

Вот пример:

 #random data:
set.seed(123); g1 <- data.frame(rlnorm(1000, 1, 3))
set.seed(123); g2 <- data.frame(rlnorm(2000, 0.4, 1.2))
colnames(g1) <- "value"; colnames(g2) <- "value"

#plotting g1 in logscale
plot_g1 <- ggplot(g1, aes(x=value))   
labs(x = "value", y = "Frequency")  
geom_density(alpha=0.25) 
theme_classic(base_size =25, base_line_size = 0.5)

plot_g1.2 <- ggplot(g1, aes(x=value))   
geom_histogram(binwidth=2.5, position = "identity", aes(y=..density..),  alpha = 0.75)  
labs(x = "value", y = "Frequency")  
geom_density(alpha=0.25) 
theme_classic(base_size = 10, base_line_size = 0.5)

plot_g1.2_log <- plot_g1.2   
scale_x_continuous(trans="log2", labels = scales::number_format(accuracy = 0.01, decimal.mark = '.'), breaks = c(0, 0.01, 0.1, 1, 10, 100, 10000), limits=c(-100, 20000))
[![plot_g1.2_log][1]][1]
 

Графики в порядке, но каждая ось X имеет разный масштаб. Я играл с ограничениями, шириной и разрывами, но я не могу заставить это работать.

введите описание изображения здесь

Одним из решений является совместное построение обоих распределений:

 ###combining both plots together
g1$cat <- "g1"; g2$cat <- "g2" ; g12 <- rbind(g1,g2)

plot_g12 <- ggplot(g12, aes(x=value, fill = cat, color = cat))   
labs(x = "value", y = "Frequency")  
geom_density(alpha=0.25) 
theme_classic(base_size =10, base_line_size = 0.5)

plot_g12.2 <- ggplot(g12, aes(x=value, fill = cat, color = cat))   
geom_histogram(binwidth=0.5, position = "identity", aes(y=..density..),  alpha = 0.75)  
labs(x = "value", y = "Frequency")  
geom_density(alpha=0.25) 
theme_classic(base_size = 10, base_line_size = 0.5)

plot_g12.2_log <- plot_g12.2   
scale_x_continuous(trans="log2", labels = scales::number_format(accuracy = 0.01, decimal.mark = '.'), breaks = c(0, 0.01, 0.1, 1, 10, 100, 10000), limits=c(-10, 20000))
plot_g12.2_log
 

введите описание изображения здесь

Но мне нужно, чтобы они разделились.
Если кто-нибудь может мне в этом помочь, я был бы очень благодарен.

Лучшие,

L

Ответ №1:

Я думаю, что причина, по которой вы не можете установить одинаковые масштабы, заключается в том, что нижний предел недопустим в пространстве журналов, например log2(-100) , оценивается NaN как . Тем не менее, вы подумывали о том, чтобы вместо этого огранить данные?

 library(ggplot2)

set.seed(123); g1 <- data.frame(rlnorm(1000, 1, 3))
set.seed(123); g2 <- data.frame(rlnorm(2000, 0.4, 1.2))
colnames(g1) <- "value"; colnames(g2) <- "value"

df <- rbind(
  cbind(g1, name = "G1"),
  cbind(g2, name = "G2")
)

ggplot(df, aes(value))  
  geom_histogram(aes(y = after_stat(density)),
                 binwidth = 0.5)  
  geom_density()  
  scale_x_continuous(
    trans = "log2",
    labels = scales::number_format(accuracy = 0.01, decimal.mark = '.'),
    breaks = c(0, 0.01, 0.1, 1, 10, 100, 10000), limits=c(1e-3, 20000))  
  facet_wrap(~ name)
#> Warning: Removed 4 rows containing non-finite values (stat_bin).
#> Warning: Removed 4 rows containing non-finite values (stat_density).
#> Warning: Removed 4 rows containing missing values (geom_bar).
 

Создано 2021-03-20 пакетом reprex (v1.0.0)

Комментарии:

1. Спасибо тебе, Теунбранд, за этот удивительный совет. Я об этом не знал. Это работает просто отлично.