Использование qplot для создания графика плотности для трех переменных?

Я хочу создать график плотности на qplot() состоящий из трех переменных ответа. Таким образом, график будет Плотность (y) против Elevation (x), с тремя функциями плотности с цветовой кодировкой, показывающими, как плотности каждого изменяются по мере изменения Elevation (ось X).

Сначала я поместил три переменные ответа (3 столбца в моем наборе данных "CAIRNGORM") в небольшое подмножество под названием "ZONES":

ZONES<-CAIRNGORM[c("prop_Cal", "prop_Emp", "prop_Jun")]

Затем я попытался создать qplot:

library(ggplot2)
qplot(Elevation, data=CAIRNGORM, geom="density", fill="ZONES", alpha=I(0.5))

который создает график, но вместо того, чтобы дать мне три трассы, по одной для каждого из prop_Cal, prop_Emp и prop_Jun, у меня есть только одна трасса, и она, кажется, показывает плотность моих данных о высоте - прямая линия!

Я был бы очень признателен, если бы кто-то помог с этим - как я могу дать qplot команду построить три трассировки, содержащихся в "ZONES" вместо переменной x? Спасибо

Редактировать: укороченная версия моих данных (при попытке поместить правильное форматирование кода в переполнение стека):

> head(CAIRNGORM)
  position group Elevation 
1       Q1     A       680   
2       Q2     A       730   
3       Q3     A       780  
4       Q4     A       830     
5       Q5     A       880      
6       Q6     A       930   
  prop_bar prop_Cal prop_Vac prop_Emp prop_Jun prop_Ces prop_Eri ZONES.prop_Cal
1     0.00     1.00      0.0        0        0     0.36      0.4           1.00
2     0.00     1.00      0.0        0        0     0.28      0.0           1.00
3     0.00     0.84      0.6        0        0     0.48      0.0           0.84
4     0.00     1.00      0.0        0        0     0.00      0.0           1.00
5     0.24     0.76      0.0        0        0     0.72      0.0           0.76
6     0.36     0.72      0.0        0        0     0.00      0.0           0.72
  ZONES.prop_Emp ZONES.prop_Jun
1              0              0
2              0              0
3              0              0
4              0              0
5              0              0
6              0              0

> head(ZONES)
  prop_Cal prop_Emp prop_Jun
1     1.00        0        0
2     1.00        0        0
3     0.84        0        0
4     1.00        0        0
5     0.76        0        0
6     0.72        0        0

1 ответ

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

library(reshape2) # For the melt function

# Fake data
ZONES = data.frame(prop_Cal=rnorm(100), 
                   prop_Emp=rnorm(100,-10,3), 
                   prop_Jun=rnorm(100,10,0.5))

# Melt into long format (take a look at the melted data frame to see what melt is doing)
ZONES.M <- melt(ZONES)

ggplot(ZONES.M, aes(value, fill=variable)) +
     geom_density(alpha=0.5)

variable содержит имена каждого столбца в вашем исходном широкоформатном фрейме данных. value содержит значения. Настройка fill эстетический variable говорит ggplot создать отдельный график плотности для каждого уровня variable,

Вы не можете построить плотность prop_Cal или две другие переменные против повышения. (1-мерный) график плотности переменной по своей сути относится к одной переменной. Если вы пытаетесь найти связь между возвышением и тремя другими переменными, возможно, вам нужен сюжет для скрипки. Например:

# Fake data with Elevation added
ZONES = data.frame(Elevation=rep(c(10,20,30,40),each=25), 
                   prop_Cal=rnorm(100), 
                   prop_Emp=rnorm(100,-10,3), 
                   prop_Jun=rnorm(100,10,10))

# Melt into long format, this time with Elevation as an id variable
ZONES.M <- melt(ZONES, id.var="Elevation")

ggplot(ZONES.M, aes(Elevation, value, group=Elevation)) +
  geom_violin() +
  facet_grid(. ~ variable)

Теперь у нас есть график плотности для каждого значения высоты, отдельно для каждой из ваших трех исходных переменных столбцов. (Вы также можете сначала объединить несколько значений высоты, используя cut функция, если вы хотите сгруппировать по полосам высот.)

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

ggplot(ZONES.M, aes(Elevation, value, group=Elevation)) +
  geom_point(colour="black", fill="lightblue", alpha=0.5, pch=21) +
  facet_grid(. ~ variable)

Если вы хотите добавить линию регрессии (которая может быть тем, что вы на самом деле ищете, если хотите обобщить взаимосвязь между Elevation и тремя другими переменными), сделайте следующее:

ggplot(ZONES.M, aes(Elevation, value, group=Elevation)) +
  geom_point(colour="black", fill="lightblue", alpha=0.5, pch=21) +
  geom_smooth(aes(group=1)) +  
  facet_grid(. ~ variable)
Другие вопросы по тегам