我想为df1
df2
上df3
的三个数据框col1
,x-axis
,col2
绘制不同长度的行。在y-axis
上。
# Data
set.seed(123)
df1<-data.frame(col1=sample(LETTERS[1:10], 10, replace=FALSE), col2=sample(c(1:26),10))
> df1
col1 col2
1 C 25
2 H 12
3 D 17
4 G 14
5 F 3
6 A 19
7 J 5
8 I 1
9 B 6
10 E 24
df2 <- data.frame(col1=sample(LETTERS[1:10], 5, replace=FALSE), col2=sample(c(1:26),5))
> df2
col1 col2
1 I 19
2 G 14
3 F 15
4 J 7
5 D 4
df3 <- data.frame(col1=sample(LETTERS[1:10], 8, replace=FALSE), col2=sample(c(1:26),8))
> df3
col1 col2
1 J 9
2 I 6
3 F 4
4 H 10
5 A 23
6 C 8
7 D 24
8 G 3
# plotting
lab.min <- min(c(df2$col2, df1$col2, df3$col2), na.rm = T)
lab.max <- max(c(df2$col2, df1$col2, df3$col2), na.rm = T)
plot(df1$col1, df1$col2, type='o', pch=0, las=2, ylim=c(lab.min, lab.max))
lines(df2$col1, df2$col2, type='o', pch=2)
lines(df3$col1, df3$col2, type='o', pch=8)
# add a legend
legend(0, 20, c('df1','df2','df3'), cex=0.8, pch=c(0,2,8), title="df")
abline(h=5)
从图中我可以看到这些线没有从所有数据帧中获取相同的col1值。所有三个数据框都在J
中具有值col1
,但该图仅显示df1
中的值。你能告诉我如何解决这个问题吗?
答案 0 :(得分:1)
问题在于col1
是一个因子,因此在绘制时,因子的整数表示用作x值。要解决此问题,请确保所有col1
变量具有相同的因子级别,因此具有相同的基础整数。
set.seed(123)
df1<-data.frame(col1=sample(LETTERS[1:10], 10, replace=FALSE), col2=sample(c(1:26),10))
df2 <- data.frame(col1=sample(LETTERS[1:10], 5, replace=FALSE), col2=sample(c(1:26),5))
df3 <- data.frame(col1=sample(LETTERS[1:10], 8, replace=FALSE), col2=sample(c(1:26),8))
## Put the data.frames in a list, and convert col1 to have same levels
dfs <- lapply(mget(paste0("df", 1:3)), function(x)
transform(x, col1=factor(col1, levels=LETTERS[1:10])))
## Put data.frames back into global environment
## Note: I only do this to reuse your code, but it would be better
## to keep them in a list
list2env(dfs, .GlobalEnv)
## plotting
lab.min <- min(c(df2$col2, df1$col2, df3$col2), na.rm = T)
lab.max <- max(c(df2$col2, df1$col2, df3$col2), na.rm = T)
plot(df1$col1, df1$col2, type='o', pch=0, las=2, ylim=c(lab.min, lab.max))
lines(df2$col1, df2$col2, type='o', pch=2)
lines(df3$col1, df3$col2, type='o', pch=8)
# add a legend
legend(0, 20, c('df1','df2','df3'), cex=0.8, pch=c(0,2,8), title="df")
abline(h=5)
这也可以通过在最初创建数据时明确设置因子级别来解决。