Опираясь на ответ Дидзиса, вот способ, чтобы получить (автор: Hadley) ggplot2
данных в geom_line
воспроизвести внешний вид base R hist
.
Краткое описание: для получения бункеров в положение так же, как основание R, я установил binwidth=1
и boundary=0
. Чтобы получить аналогичный вид, я использовал color=black
и fill=white
. И чтобы получить то же положение сегментов линии, я использовал ggplot_build
. Вы найдете другие ответы Дидзиса, которые используют этот трюк.
# make a dataframe for ggplot
set.seed(1)
x = runif(100, 0, 10)
y = cumsum(x)
df <- data.frame(x = sort(x), y = y)
# make geom_histogram
p <- ggplot(data = df, aes(x = x)) +
geom_histogram(aes(y = cumsum(..count..)), binwidth = 1, boundary = 0,
color = "black", fill = "white")
# extract ggplot data
d <- ggplot_build(p)$data[[1]]
# make a data.frame for geom_line and geom_point
# add (0,0) to mimick base-R plots
df2 <- data.frame(x = c(0, d$xmax), y = c(0, d$y))
# combine plots: note that geom_line and geom_point use the new data in df2
p + geom_line(data = df2, aes(x = x, y = y),
color = "darkblue", size = 1) +
geom_point(data = df2, aes(x = x, y = y),
color = "darkred", size = 1) +
ylab("Frequency") +
scale_x_continuous(breaks = seq(0, 10, 2))
# save for posterity
ggsave("ggplot-histogram-cumulative-2.png")
Могут быть более легкие пути, которые вас увидят! Так как объект ggplot также сохраняет два других значения x
: минимальный и максимальный. Таким образом, вы можете сделать другие многоугольники с помощью этой функции удобства:
# Make polygons: takes a plot object, returns a data.frame
get_hist <- function(p, pos = 2) {
d <- ggplot_build(p)$data[[1]]
if (pos == 1) { x = d$xmin; y = d$y; }
if (pos == 2) { x = d$x; y = d$y; }
if (pos == 3) { x = c(0, d$xmax); y = c(0, d$y); }
data.frame(x = x, y = y)
}
df2 = get_hist(p, pos = 3) # play around with pos=1, pos=2, pos=3
Как насчет добавления сюжета в качестве изображения? – ziggystar
В моем ответе ниже я дал репликацию выстрела. Вы можете приблизиться к '' theme_bw() '' или '' theme_classic() ''. – PatrickT