如何根据几个条件绘制x和y?

时间:2016-01-16 23:21:57

标签: r plot

我有一个数据框,构造如下:

col1<-c(0.10, 0.21, 0.34, 0.39, 0.54, 0.67,0.89)
col2<-c (0,100,500,1000,3000,5000,8000 )
col3<-c ("b", "a","a","c", "c","b",  "c" )
mydata<-data.frame(col1,col2,col3)

    > mydata
      col1   col2 col3
 #   1 0.10    0    b
 #   2 0.21   100   a
 #   3 0.34   500   a
 #   4 0.39  1000   c
 #   5 0.54  3000   c
 #   6 0.67  5000   b
 #   7 0.89  8000   c

这是我在col2col1之间创建情节的代码:

plot(mydata$col2,mydata$col1,
     main = "plot of my data",
     xlab = "x", ylab= "y",
     pch =c(21,21,21)[mydata$col3], bg=c("blue","grey", "red")[mydata$col3], 
)
legend("topright",pch=c(21,21,21), title="categories:",
       c("a","b", "c"),pt.bg=c("blue","red","grey"))

它创建了情节:

enter image description here

我的代码存在问题:

1,图中应该有7个点,但是一个已被正确的盒子覆盖。是否有更好的方法来显示所有点?

2,我希望在x轴上有不同的比例来标记所需间隔的刻度线,例如plot 2。看到100和500之间的间隔几乎与3000和8000相同,因此较小的值不会被极端地抑制到左侧,这就是我想要的。如何实现?

3,似乎在我的语法pch =c(21,21,21)[mydata$col3], bg=c("blue","grey", "red")[mydata$col3]中,我没有指定哪种颜色映射到“a”,“b”或“c”。如果我想分别将"blue","grey", "red"中的颜色"a", "b" and "c"映射到col3。如何指定?

感谢任何建议。

2 个答案:

答案 0 :(得分:1)

对于第二个,您可以使用自定义轴。在您的情况下,您想要自定义x轴。因此,在plot函数中,您需要添加xaxt="n",这会禁用原始x轴。然后,您可以使用axis添加您的。{1}}。在您的情况下,请尝试

axis(1, at=c(a,b,c,d,e),labels=c(a,b,c,d,e),xxx,xxx)

其中a,b,c,d,e是您想要的值。

示例:

y <- x <- c(1:5)
plot(x, y,type="l", xaxt="n")
axis(1, at=c(1,1.3,1.5,1.7,2.8),labels=c(1,1.3,1.5,1.7,2.8))

enter image description here

对于第三个问题,如何只添加一列映射颜色到dataframe?如下: 例如,

 mydata$color <-ifelse(mydata$col3=="a","blue",ifelse(mydata$col3=="b","red","grey"))

用蓝色映射a,用红色映射b,用灰色映射c。在情节中,

plot(mydata$col2,mydata$col1,xxxxxx, bg=mydata$color,  )

enter image description here

答案 1 :(得分:1)

对于3,如果您不介意安装plyr包,则可以使用mapvalues()功能。在您的情况下,它将是bg=as.character(mapvalues(mydata$col3, from=c("a", "b", "c"), to=c("blue", "grey", "red")))。这里的函数as.character()是因为mapvalues()的输出是一个因素。您还可以将数据框中的col3更改为字符,然后mapvalues()的输出将是字符。如果您不想安装新软件包,可以使用levels(mydata$col3) <- c("blue", "grey", "red")更改col3的级别。