在同一图中绘制 ecdf 和密度并放大到特定部分
Plot ecdf and density in the same plot and zoom in to specific part
我想使用 ggplot2 在同一图中绘制密度和 ecdf。我在这里写了一段代码
library(ggplot2)
library(reshape)
set.seed(101)
var1 = rnorm(1000, 0.5)
var2 = rnorm(100000,0.5)
combine = melt(data.frame("var1" = var1,"var2"= var2))
ggplot(data = combine) +
geom_density(aes(x = value, color = variable), alpha = 0.2)+
scale_y_continuous(name = "Density",sec.axis = sec_axis(~.*(1*(max(density(var1)$y,density(var2)$y))), name = "Ecdf")) +
ggtitle("Density and Ecdf plot ") +
theme_bw() +
theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
text = element_text(size = 12, family = "Tahoma")) +
scale_fill_brewer(palette="Accent")+
stat_ecdf(aes(x = value, color = variable))
这导致(黑色矩形除外)
但是,轴不正确左 ya 轴应该是密度限制 (0,0.4),右 y 轴应该是 ecdf 限制 (0,1)。我还希望对这两个数字进行缩放,例如密度的最大值,即 0.4 应该对应于 ecdf 1 的最大值。
在此之后我想放大图,尤其是右上部分(黑色矩形,上部 25%),因为不需要整个图。我需要两个图,一个是全图,另一个是放大的。
让我知道它是如何使用 ggplot2 完成的。
您可以尝试在绘图前计算密度和经验累积分布。我在这里使用 tidyverse。特别是 purrr::map
函数在这里很有帮助。
library(tidyverse)
# density
dens <- combine %>%
as.tibble() %>%
split(.$variable) %>%
map(~density(.x$value) %>%
with(.,tibble(x=x, y=y))) %>%
bind_rows(.id = "variable")
# ecdf
df <- combine %>%
as.tibble() %>%
split(.$variable) %>%
map2(.,split(dens, dens$variable), ~ecdf(.x$value)(.y$x) %>%
tibble(x=.y$x, Ecdf=.)) %>%
bind_rows(.id = "variable") %>%
bind_cols(dens,.)
# scaling factor
SCALE <- max(df$y)
# the plot
ggplot(df,aes(x,color=variable)) +
geom_line(aes(y=y)) +
geom_line(aes(y=Ecdf*SCALE)) +
scale_y_continuous(name = "Density",sec.axis = sec_axis(trans = ~./SCALE, name = "Ecdf"))
# zooming
p + coord_cartesian(xlim = c(1.5, 5))
我想使用 ggplot2 在同一图中绘制密度和 ecdf。我在这里写了一段代码
library(ggplot2)
library(reshape)
set.seed(101)
var1 = rnorm(1000, 0.5)
var2 = rnorm(100000,0.5)
combine = melt(data.frame("var1" = var1,"var2"= var2))
ggplot(data = combine) +
geom_density(aes(x = value, color = variable), alpha = 0.2)+
scale_y_continuous(name = "Density",sec.axis = sec_axis(~.*(1*(max(density(var1)$y,density(var2)$y))), name = "Ecdf")) +
ggtitle("Density and Ecdf plot ") +
theme_bw() +
theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
text = element_text(size = 12, family = "Tahoma")) +
scale_fill_brewer(palette="Accent")+
stat_ecdf(aes(x = value, color = variable))
这导致(黑色矩形除外)
但是,轴不正确左 ya 轴应该是密度限制 (0,0.4),右 y 轴应该是 ecdf 限制 (0,1)。我还希望对这两个数字进行缩放,例如密度的最大值,即 0.4 应该对应于 ecdf 1 的最大值。
在此之后我想放大图,尤其是右上部分(黑色矩形,上部 25%),因为不需要整个图。我需要两个图,一个是全图,另一个是放大的。
让我知道它是如何使用 ggplot2 完成的。
您可以尝试在绘图前计算密度和经验累积分布。我在这里使用 tidyverse。特别是 purrr::map
函数在这里很有帮助。
library(tidyverse)
# density
dens <- combine %>%
as.tibble() %>%
split(.$variable) %>%
map(~density(.x$value) %>%
with(.,tibble(x=x, y=y))) %>%
bind_rows(.id = "variable")
# ecdf
df <- combine %>%
as.tibble() %>%
split(.$variable) %>%
map2(.,split(dens, dens$variable), ~ecdf(.x$value)(.y$x) %>%
tibble(x=.y$x, Ecdf=.)) %>%
bind_rows(.id = "variable") %>%
bind_cols(dens,.)
# scaling factor
SCALE <- max(df$y)
# the plot
ggplot(df,aes(x,color=variable)) +
geom_line(aes(y=y)) +
geom_line(aes(y=Ecdf*SCALE)) +
scale_y_continuous(name = "Density",sec.axis = sec_axis(trans = ~./SCALE, name = "Ecdf"))
# zooming
p + coord_cartesian(xlim = c(1.5, 5))