Когда я создаю гистограммы в ggplot2, где позиции столбцов равны dodge
, я ожидаю чего-то подобного, когда между группами столбцов есть пространство (т.е. обратите внимание на белое пространство между каждой группой красных/зеленых пар):
Мне трудно добиться того же эффекта, когда я строю гистограмму с непрерывными данными. Кажется, я не могу добавить пространство между группами баров, и вместо этого все сжимается вместе. Как видите, это визуально затрудняет сравнение красных и зеленых пар:
Чтобы воспроизвести мою проблему, я создал пример набора данных здесь: https://www.dropbox.com/s/i9nxzo1cmbwwfsa/data.csv?dl=0.
Код для воспроизведения:
data <- read.csv("https://www.dropbox.com/s/i9nxzo1cmbwwfsa/data.csv?dl=1")
ggplot(data, aes(x = soldPrice, fill = month)) +
geom_histogram(binwidth=1e5, position=position_dodge()) +
labs(x = "Sold Price", y = "Sales", fill = "") +
scale_x_continuous(labels=scales::comma, breaks=seq(0, 2e6, by = 1e5)) +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
Как я могу добавить пробел между группами красных/зеленых пар?
geom_histogram()
От ?position_dodge()
:
Dodging preserves the vertical position of an geom while adjusting the horizontal position
Эта функция принимает аргумент width
, который определяет создаваемое пространство.
Чтобы получить то, что, как я думаю, вы хотите, вам нужно указать подходящее значение для position_dodge()
. В вашем случае, где binwidth=1e5
, вы можете играть, например. 20% от этого значения: position=position_dodge(1e5-20*(1e3))
.
(Я оставил остальную часть вашего кода нетронутой.)
Вы можете использовать следующий код:
ggplot(data, aes(x = soldPrice, fill = month)) +
geom_histogram(binwidth=1e5, position=position_dodge(1e5-20*(1e3))) + ### <-----
labs(x = "Sold Price", y = "Sales", fill = "") +
scale_x_continuous(labels=scales::comma, breaks=seq(0, 2e6, by = 1e5)) +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
что дает этот сюжет:
geom_bar
geom_histogram()
не предназначен для производства того, что вы хотите. geom_bar()
, с другой стороны, обеспечивает необходимую вам гибкость.
Вы можете создать гистограмму с помощью geom_histogram
и сохранить ее в объекте ggplot. Затем вы генерируете информацию о графике с помощью ggplot_build()
. Сейчас,
вы можете использовать информацию о построении гистограммы в объекте для создания гистограммы с помощью geom_bar()
## save ggplot object to h
h <- ggplot(data, aes(x = soldPrice, fill = month)) +
geom_histogram(binwidth=1e5, position=position_dodge(1e5-20*(1e3)))
## get plotting information as data.frame
h_plotdata <- ggplot_build(h)$data[[1]]
h_plotdata$group <- as.factor(h_plotdata$group)
levels(h_plotdata$group) <- c("May 2018", "May 2019")
## plot with geom_bar
ggplot(h_plotdata, aes(x=x, y=y, fill = group)) +
geom_bar(stat = "identity") +
labs(x = "Sold Price", y = "Sales", fill = "") +
scale_x_continuous(labels=scales::comma, breaks=seq(0, 2e6, by = 1e5)) +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
получается этот график:
Пожалуйста, дайте мне знать, хотите ли вы этого.
Он приближается, но теперь полосы перекрываются. Если вы посмотрите на мой первый снимок экрана, вы увидите, что группы столбцов расположены бок о бок без перекрытия, а между группами есть пустое пространство. Я пробовал position_dodge2
(с разными значениями padding
), и он добавляет пробелы, но не группирует связанные полосы вместе.
Спасибо за Альтернативу 2. Это впечатляет! Я не знаю, как вы это сделали, но это работает отлично. Мне нужно узнать больше о ggplot_build
. :-)
Рад, что смог помочь. Мне тоже пришлось поискать, и я кое-что узнал за это время ;-)
Я добавил альтернативу без перекрывающихся полос. Пожалуйста, посмотрите.