使用qplot为三个变量创建密度图?

时间:2014-12-21 21:22:00

标签: r graph ggplot2 factors density-plot

我希望在qplot()上创建一个包含三个响应变量的密度图。因此,图表将是密度(y)与海拔高度(x),三个颜色编码的密度函数显示每个变化的密度随高程(x轴)的变化而变化。

首先,我将三个响应变量(我的数据集“CAIRNGORM”中的3列)子集化为一个名为“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变量?感谢

编辑:缩短版本的数据(尝试在Stack Overflow中输入正确的代码格式):

> 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 个答案:

答案 0 :(得分:1)

ggplot2更喜欢&#34; long&#34;而不是&#34;宽&#34;格式。以下是如何在单个图表中获取三个密度图。由于示例数据中的两列都是零,因此我创建了一些虚假数据以供说明:

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告诉ggplotvariable的每个级别创建单独的密度图。

enter image description here

您无法根据高程绘制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)

现在我们为每个Elevation值创建一个密度图,分别为每个原始三列变量。 (如果要按高程波段进行分组,还可以使用cut函数首先组合多个高程值。)

enter image description here

如果你想要每个变量与Elevation的散点图,你可以这样做:

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)