Используйте facet_zoom на графике stat_density - PullRequest
2 голосов
/ 02 ноября 2019

Я хотел бы использовать facet_zoom, но по какой-то причине увеличенная область приводит к пустым значениям.

Два набора данных, которые я использую, представляют собой просто числовые векторы из 1.000.000 чисел, сгенерированных из модифицированного полиномиального распределения. В увеличенной области есть небольшой всплеск, который я хотел бы показать.

prova <-readRDS("probcond1.rds")
prova1 <-readRDS("probpoly.rds")
dfGamma <-data.frame(prova)

ggplot(dfGamma, aes(x=prova)) + stat_density(aes(y=..count..), color="black", fill="blue", alpha=0.3)

g <- ggplot(dfGamma, aes(x=prova)) +
  stat_density(aes(y=..count..), color="black", fill="blue", alpha=0.3) +
  scale_x_continuous(breaks=c(0,1,2,3,4,5,10,30,100,300,1000,4000,5000), trans="log1p", expand=c(0,0)) +
  theme_bw()

g+expand_limits(x = c(1, 6000)) +facet_zoom(xlim = c(4000,5000))

Я действительно новичок в R. Извините за мое невежество

1 Ответ

2 голосов
/ 02 ноября 2019

Ваш axis находится в масштабе log1p, поэтому ваш xlim должен быть заключен в log1p для увеличения. Вы можете сделать следующее:

g+expand_limits(x = c(1, 6000)) +facet_zoom(xlim = c(log1p(4000),log1p(5000)))

Вот пример, использующий набор данных mtcars.

library(ggplot2)
library(ggforce)

g <- ggplot(mtcars, aes(x=hp)) +
  stat_density(aes(y=..count..), color="black", fill="blue", alpha=0.3) +
  scale_x_continuous(breaks=c(0,1,2,3,4,5,10,30,100,300), trans="log1p", expand=c(0,0)) +
  theme_bw()

Если вы используете facet_zoom(xlim = c(100,300)), как показано ниже, вы получите пустой результат масштабирования (плоские значения 100 и 300 не существуют на оси x оси g):

g+expand_limits(x = c(1, 300)) +facet_zoom(xlim = c(100,300))

Выход-1 (плоское увеличение масштаба)

zoom_empty

Если вы преобразуете xlim, используя log1p, вы можете увеличить соответствующие значенияx-axis участка g. Вы можете сделать это следующим образом:

g+expand_limits(x = c(1, 300)) +facet_zoom(xlim = c(log1p(100),log1p(300)))

Output-2 (log1p zoom)

zoom_proper

Если вы хотите zoom по оси независимо вы можете сделать следующее:

g+expand_limits(x = c(1, 300)) +facet_zoom(xlim = c(log1p(100),log1p(300)), ylim = c(5,10), split = TRUE)

Вывод

zoom_xy_indpt

Как вы можете видеть, я делал масштабированиеylim между 5 и 10 и split = TRUE делают масштабирование независимым, и вы можете иметь несколько видов оси масштабирования или, если вам нужен только один вид, вы можете оставить split его значение по умолчаниюFALSE. В руководстве содержится гораздо больше информации, с которой вы можете ознакомиться, на случай, если оно доступно по адресу Пакет 'ggforce'

Надеюсь, это поможет.

...