ggplot:如何实现基于排名的y轴并保持未使用的因子水平

时间:2014-02-11 21:14:04

标签: r ggplot2 rank

我正在尝试构建一个简单的散点图: 这就是我的数据(dlong):

     Spender variable value  
1       1      IFN     2  
2       2      IFN     6  
3       3      IFN     5   
4       1      iL2  <NA>  
5       2      iL2     4  
6       3      iL2     8  

我最初从我的数据框中融化

由于我是一个自我调教,我到目前为止做到了:

  ggplot(na.omit(dlong), aes(x=Spender, y=value, coulor=variable, group=variable)) +
      geom_point(size=2, aes(shape=variable))

产生图表

reaction to proteins

x轴上列举的测试人员,对不同时间点(=值)(y轴)的反应。这些反应因蛋白质的类型而异(=组=变量)。

我的真实数据看起来像这样:

    Spender variable value  
1        1  ZP0.IFN   ZP0  
2        2  ZP0.IFN        
3        3  ZP0.IFN   ZP0  
4        4  ZP0.IFN        
5        5  ZP0.IFN        
6        6  ZP0.IFN        
7        7  ZP0.IFN        
8        8  ZP0.IFN   ZP0  
9        9  ZP0.IFN        
10      10  ZP0.IFN        
11      11  ZP0.IFN   ZP0  
12      12  ZP0.IFN   ZP0  
13      13  ZP0.IFN  
14      14  ZP0.IFN        
15      15  ZP0.IFN        
16      16  ZP0.IFN   ZP0  
17       1      IFN   ZP2  
18       2      IFN  ZP21  
19       3      IFN        
20       4      IFN        
21       5      IFN  ZP14  
22       6      IFN        
23       7      IFN  ZP14  
24       8      IFN  ZP21  
25       9      IFN  ZP21  

这些值实际上是排名数据
(ZP0&lt; ZP2&lt; ZP4&lt; ZP7 ......)。

这是我的问题。如何在y轴上实现排名数据?

我接下来做了什么:

dlong$value <- factor(dlong$value,   
levels=c("ZP0", "ZP2", "ZP4", "ZP7", "ZP14", "ZP21", "ZP28", "ZP35", "ZPM9", "ZPM91"))  
ggplot(na.omit(dlong), aes(x=Spender, y=value, group=variable)) +  
geom_point(size=3, aes(shape=variable))    
  1. 使用R它不会打开我的情节:所以我在前面和后面添加了&gt; png(filename =“”)和dev.off。为什么窗户不会弹出? new scatter

  2. 在y轴上
  3. 它不会向我显示所有需要的时间点 - 它也会留下真实的点数(例如,Spender 1,iL2,ZP4)

  4. 如何在灰色区域中使用白色粗线的每个“Spender”在x轴上标记?

2 个答案:

答案 0 :(得分:0)

您可以提供排名而不是值:

dlong$dummy <- as.numeric(gsub("ZP","",as.character(dlong$value)))

ggplot(na.omit(dlong), aes(x=Spender, y=dummy, colour=variable, group=variable)) + geom_point(size=2, aes(shape=variable))

enter image description here

答案 1 :(得分:0)

你快到了!您只需将value转换为具有已定义级别的因子。

数据

dlong <- read.table(textConnection("1 1 ZP0.IFN ZP0
2 2 ZP0.IFN
3 3 ZP0.IFN ZP0
4 4 ZP0.IFN
5 5 ZP0.IFN
6 6 ZP0.IFN
7 7 ZP0.IFN
8 8 ZP0.IFN ZP0
9 9 ZP0.IFN
10 10 ZP0.IFN
11 11 ZP0.IFN ZP0
12 12 ZP0.IFN ZP0
13 13 ZP0.IFN
14 14 ZP0.IFN
15 15 ZP0.IFN
16 16 ZP0.IFN ZP0
17 1 IFN ZP2
18 2 IFN ZP21
19 3 IFN
20 4 IFN
21 5 IFN ZP14
22 6 IFN
23 7 IFN ZP14
24 8 IFN ZP21
25 9 IFN ZP21
","r"),fill=NA,na.strings="")[,-1]

colnames(dlong) <- c("Spender","variable","value")
dlong
##    Spender variable value
## 1        1  ZP0.IFN   ZP0
## 2        2  ZP0.IFN  <NA>
## 3        3  ZP0.IFN   ZP0
## 4        4  ZP0.IFN  <NA>
## 5        5  ZP0.IFN  <NA>
## 6        6  ZP0.IFN  <NA>
## 7        7  ZP0.IFN  <NA>
## 8        8  ZP0.IFN   ZP0
## 9        9  ZP0.IFN  <NA>
## 10      10  ZP0.IFN  <NA>
## 11      11  ZP0.IFN   ZP0
## 12      12  ZP0.IFN   ZP0
## 13      13  ZP0.IFN  <NA>
## 14      14  ZP0.IFN  <NA>
## 15      15  ZP0.IFN  <NA>
## 16      16  ZP0.IFN   ZP0
## 17       1      IFN   ZP2
## 18       2      IFN  ZP21
## 19       3      IFN  <NA>
## 20       4      IFN  <NA>
## 21       5      IFN  ZP14
## 22       6      IFN  <NA>
## 23       7      IFN  ZP14
## 24       8      IFN  ZP21
## 25       9      IFN  ZP21

转换为给定定义排名的因素

## The values are actually ranked data
## (with ZP0 < ZP2 < ZP4 < ZP7 ... ).
require(gtools)
dlong$value <- as.character(dlong$value)
dlong$value <- factor(dlong$value,levels=mixedsort(unique(dlong$value)))

然后很好!

require(ggplot2)
ggplot(na.omit(dlong),aes(x=Spender, y=value, coulor=variable, group=variable)) +
  geom_point(size=2, aes(shape=variable))

enter image description here

修改:2014年2月12日

编辑后的帖子中的1)-3)问题与plot / ggplot的其他方面有关。

1)这显然是图形设备的问题 - 无论是安装还是无法正常启动。假设您已安装它,请尝试以下操作以检查它是否将启动/弹出设备窗口,

X11()   # starts/pops up a X11 graphics device
plot(1:10)

您可能会收到错误消息,这意味着R无法初始化此类设备。然后,您需要使用pdfpng(或其他)而不是弹出方法。

2)要保持未使用的级别,请使用scale_y_discrete(drop=FALSE)

3)要显示所有Spender,请将它们转换为与value类似的因子。并通过scale_x_discrete(drop=FALSE)关闭放置。

继续上面的数据

dlong$value <- as.character(dlong$value)    
dlong$value <- factor(dlong$value,   
levels=c("ZP0", "ZP2", "ZP4", "ZP7", "ZP14", "ZP21", "ZP28", "ZP35", "ZPM9", "ZPM91"))
dlong$Spender <- factor(dlong$Spender)
ggplot(na.omit(dlong), aes(x=Spender, y=value, group=variable)) +  
  geom_point(size=3, aes(shape=variable)) +
  scale_y_discrete(drop=FALSE)+ 
  scale_x_discrete(drop=FALSE) 

enter image description here