R plot - 基于其他数据框中存在的点图中的条目颜色(使用循环)

时间:2016-04-17 13:13:52

标签: r plot ggplot2

我有两个数据框,一个包含个体的类别,另一个包含某些字符的值,如下所示:

df1:

individuals V1       V2
HG097      -0.0181  -0.0818
HG099      -0.0188  -0.0808
HG100      -0.021   -0.0753
HG101      -0.0196  -0.0804
HG1941     -0.0206   0.0174
HG1942     -0.031    0.0075
HG1944     -0.0291   0.0454
HG1945     -0.0245  -0.0128
HG1947     -0.0184  -0.0065
HG1950      0.006    0.0167
NA18542    -0.0296   0.0899
NA18543    -0.0318   0.1012
NA18544    -0.0305   0.096
NA18545    -0.0317   0.1068
NA18546    -0.0315   0.1016
NA18547    -0.0332   0.098  

df2:

GR1      GR2       GR3        GR4
HG097    HG100     HG1944     NA18543
HG099    HG1941    HG1945     NA18544
HG101    HG1947    NA18542    NA18545  

现在,在从V1 v.s V2绘制df1时,我想根据individualdf2中所属的组对点进行着色。那么,如何为此目的设置循环?

df1 <- read.table("data_file", header =T)
df2 <- read.table("persons_group_file", header =T)
plot(df1$V1, df1$V2, col=...............)

2 个答案:

答案 0 :(得分:3)

此处不需要循环,您需要mergemelt。以下是我将如何解决它:将df2转换为长格式,然后与df1合并。使用ggplot进行绘图非常简单。

请注意,并非所有个人都已在示例数据中分配了组。

library(reshape2)
library(ggplot2)

#Convert df2 from wide format to long format
mergedat <- melt(df2,measure.vars=colnames(df2))

#Merged the data into df1:
plotdat <- merge(df1, mergedat, by.x="individuals",by.y="value", all.x=T)

#head(plotdat)
# individuals      V1      V2     variable
# 1       HG097 -0.0181 -0.0818      GR1
# 2       HG099 -0.0188 -0.0808      GR1
# 3       HG100 -0.0210 -0.0753      GR2
# 4       HG101 -0.0196 -0.0804      GR1
# 5      HG1941 -0.0206  0.0174      GR2
# 6      HG1942 -0.0310  0.0075     <NA>

#plotting
p1 <- ggplot(plotdat, aes(x=V1,y=V2,color=variable)) + geom_point()
p1

答案 1 :(得分:1)

我会避免使用循环来执行此操作。如果您的数据格式正确,则很容易将其传递给ggplot2进行绘图。

#First do some data wrangling to get data into correct format
#load required libraries
library(tidyr)
library(dplyr)
#Convert df2 from wide format to long format
tall_df <- tidyr::gather(df2)
#Incorporate that data into df1
merged_df <- dplyr::full_join(df1, tall_df, by = c("individuals" = "value"))
#Then pass this data to ggplot2 to print:
library(ggplot2)
g = ggplot(merged_df, aes(x = V1, y=V2)) + geom_point() + aes(colour = key)
g

enter image description here