0

我希望创建一个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 变量中的三个轨迹?谢谢

编辑:我的数据的缩短版本(尝试在堆栈溢出中放置正确的代码格式):

> 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
4

1 回答 1

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根据高程绘制密度或其他两个变量。变量的(一维)密度图本质上是关于单个变量的。如果您试图找出海拔和其他三个变量之间的关系,也许您需要一个小提琴图。例如:

# 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(如果要按高程带分组,也可以先使用该函数组合多个高程值。)

在此处输入图像描述

相反,如果您想要每个变量与高程的散点图,您可以这样做:

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)
于 2014-12-22T06:53:28.890 回答