绘制具有不同长度的数据帧的线

时间:2015-08-12 07:48:20

标签: r plot dataframe

我想为df1 df2df3的三个数据框col1x-axiscol2绘制不同长度的行。在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)

enter image description here

从图中我可以看到这些线没有从所有数据帧中获取相同的col1值。所有三个数据框都在J中具有值col1,但该图仅显示df1中的值。你能告诉我如何解决这个问题吗?

1 个答案:

答案 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)

enter image description here

这也可以通过在最初创建数据时明确设置因子级别来解决。