【问题标题】:Using qplot to create a density graph for three variables?使用 qplot 为三个变量创建密度图?
【发布时间】:2015-02-20 00:53:49
【问题描述】:

我希望在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

【问题讨论】:

  • 欢迎来到 SO!如果您能花一些时间提供reproducible example,这将是最有帮助的,尤其是对于涉及绘图的问题。
  • 看来您正在处理问题中的多个数据框。请在您的问题中提供一个小样本
  • 嗨 - 感谢编辑它 - 我想我已经知道如何编辑成代码格式 - 你在每行之前放了四个空格?无论如何,关于我的数据,我只使用了一个主数据集 CAIRNGORM,并从 CAIRNGORM 中的三个重要变量创建了一个名为 ZONES 的子集,希望它能让 qplot 工作,但可惜它没有。道歉编码和 R 不是我的强项。我确定这很简单,我做错了。
  • 看起来你想要一个“响应变量”(意思是ZONES中的列?)对Elevation的密度图。但是(一维)密度图只是单个变量中值分布的平滑直方图,而不是一个变量相对于另一个变量的值。你能多说一些你期望的情节是什么样的吗?我已经在下面发布了一个可能的答案,但如果这不是你的想法,请告诉我,我会更新我的答案。

标签: r graph ggplot2 factors density-plot


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

您无法绘制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)

【讨论】:

  • 哇——谢谢!但是,我希望沿 x 轴绘制高程。我尝试用“dataset$Elevation”替换“value”,但没有成功。我的变量数据值对应于特定的高程值,我想表示每个变量在高程变化时的密度。我不知道这是否可以做到。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多