Подтвердить что ты не робот

Несколько гистограмм с ggplot2 - позиция

Я пытаюсь построить бок о бок следующие наборы данных

dataset1=data.frame(obs=runif(20,min=1,max=10))
dataset2=data.frame(obs=runif(20,min=1,max=20))
dataset3=data.frame(obs=runif(20,min=5,max=10))
dataset4=data.frame(obs=runif(20,min=8,max=10))

Я попытался добавить опцию position = "dodge" для geom_histogram без везения. Как я могу изменить следующий код для построения столбцов гистограмм бок о бок без перекрытия?

ggplot(data = dataset1,aes_string(x = "obs",fill="dataset")) +
geom_histogram(binwidth = 1,colour="black", fill="blue")+
geom_histogram(data=dataset2, aes_string(x="obs"),binwidth = 1,colour="black",fill="green")+
geom_histogram(data=dataset3, aes_string(x="obs"),binwidth = 1,colour="black",fill="red")+
geom_histogram(data=dataset4, aes_string(x="obs"),binwidth = 1,colour="black",fill="orange")
4b9b3361

Ответ 1

ggplot2 лучше всего работает с "длинными" данными, где все данные находятся в одном кадре данных, а разные группы описываются другими переменными в кадре данных. С этой целью

DF <- rbind(data.frame(fill="blue", obs=dataset1$obs),
            data.frame(fill="green", obs=dataset2$obs),
            data.frame(fill="red", obs=dataset3$obs),
            data.frame(fill="orange", obs=dataset3$obs))

где я добавил столбец fill, который имеет значения, которые вы использовали в ваших гистограммах. Учитывая это, сюжет можно сделать с помощью:

ggplot(DF, aes(x=obs, fill=fill)) +
  geom_histogram(binwidth=1, colour="black", position="dodge") +
  scale_fill_identity()

где position="dodge" теперь работает.

enter image description here

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

DF <- rbind(data.frame(dataset=1, obs=dataset1$obs),
            data.frame(dataset=2, obs=dataset2$obs),
            data.frame(dataset=3, obs=dataset3$obs),
            data.frame(dataset=4, obs=dataset3$obs))
DF$dataset <- as.factor(DF$dataset)
ggplot(DF, aes(x=obs, fill=dataset)) +
  geom_histogram(binwidth=1, colour="black", position="dodge") +
  scale_fill_manual(breaks=1:4, values=c("blue","green","red","orange"))

Это то же самое, за исключением легенды.

enter image description here