在每个构面中使用不同的比例并设置不同的构面顺序

时间:2014-07-12 16:10:01

标签: r ggplot2

我有一个data.frame

> head(df,30)
   method  FP TP                    data
1      HF   0  1 A p=10000 n=200 SNR=0.5
2      HM  15  2 A p=10000 n=200 SNR=0.5
3   HMP80   7  2 A p=10000 n=200 SNR=0.5
4   HMP90   2  2 A p=10000 n=200 SNR=0.5
5     LCV   0  2 A p=10000 n=200 SNR=0.5
6    LKSC   0  1 A p=10000 n=200 SNR=0.5
7    LP70   0  1 A p=10000 n=200 SNR=0.5
8    LP85   0  1 A p=10000 n=200 SNR=0.5
9  SS0206   0  0 A p=10000 n=200 SNR=0.5
10 SS0208   0  0 A p=10000 n=200 SNR=0.5
11 SS0406   0  0 A p=10000 n=200 SNR=0.5
12 SS0408   0  0 A p=10000 n=200 SNR=0.5
13 SS0506   0  0 A p=10000 n=200 SNR=0.5
14 SS0508   0  0 A p=10000 n=200 SNR=0.5
15     HF  26  7   A p=10000 n=200 SNR=2
16     HM 137  9   A p=10000 n=200 SNR=2
17  HMP80 136  9   A p=10000 n=200 SNR=2
18  HMP90  64  8   A p=10000 n=200 SNR=2
19    LCV  67  8   A p=10000 n=200 SNR=2
20   LKSC   0  3   A p=10000 n=200 SNR=2
21   LP70  67  8   A p=10000 n=200 SNR=2
22   LP85  51  8   A p=10000 n=200 SNR=2
23 SS0206   0  2   A p=10000 n=200 SNR=2
24 SS0208   0  0   A p=10000 n=200 SNR=2
25 SS0406   0  0   A p=10000 n=200 SNR=2
26 SS0408   0  0   A p=10000 n=200 SNR=2
27 SS0506   0  0   A p=10000 n=200 SNR=2
28 SS0508   0  0   A p=10000 n=200 SNR=2
29     HF  66 16  A p=10000 n=200 SNR=10
30     HM 292 16  A p=10000 n=200 SNR=10

我正在使用ggplot2进行策划

d = melt(df, id=c("method", "data"))

ggplot() + geom_bar(data=d, aes(x=method, y=value, fill=variable), stat='identity', position='dodge', width=0.5) +
  facet_wrap(~data, ncol=3) +
  theme_bw() + xlab("Method") + ylab("") +
  theme(axis.title.x = element_text(face="bold", colour="#990000", size=20),
          axis.text.x  = element_text(angle=90, vjust=0.5, size=20),
        axis.text.y  = element_text(angle=0, vjust=0.5, size=20),
        legend.text = element_text(colour = 'black', angle = 0, size = 20),
        legend.title = element_text(colour = 'white', angle = 0, size = 20, hjust = 0, vjust = 0))

我想改变两件事:

1 - 当我绘制面部的顺序时,由值'data'定义。 SNR = 10的字符串位于SNR = 2的字符串之前。我想在SNR = 10

之前获得SNR = 2的数据

2-我希望每个方面都有不同的比例。 (现在每个方面都从0变为近300.)

我该如何更改?

编辑:

我找到了第一个问题的解决方案

u = unique(df$data) 
levels(u) = u 
d$data = factor(df$data, levels=levels(u))

关于我使用选项

的第二个问题
 facet_wrap(~data, ncol=3, scales = 'free_y') 

但问题是我想在轴上只有整数值。 我尝试了scale_y_discrete(),但在这种情况下,在某些方面绘制了太多的值。 我该如何解决这个问题?

编辑:

这是我目前的R代码。我已经尝试过秤包但我不明白如何在我的情况下使用它。

df = read.csv(file = "Desktop/n200_p10000.csv")
df$method.1 = NULL
df$score = NULL
df$FN = NULL
df$TN = NULL
d = melt(df, id=c("method", "data"))

u = unique(df$data)
levels(u) = u

d$data = factor(df$data, levels=levels(u))

ggplot() + geom_bar(data=d, aes(x=method, y=value, fill=variable), stat='identity', position='dodge', width=0.5) +
  facet_wrap(~data, ncol=3, scales = 'free_y') +
  scale_y_continuous() + 
  theme_bw() + xlab("Method") + ylab("") +
  theme(axis.title.x = element_text(face="bold", colour="#990000", size=20),
          axis.text.x  = element_text(angle=90, vjust=0.5, size=20),
        axis.text.y  = element_text(angle=0, vjust=0.5, size=20),
        legend.text = element_text(colour = 'black', angle = 0, size = 20),
        legend.title = element_text(colour = 'white', angle = 0, size = 20, hjust = 0, vjust = 0))

1 个答案:

答案 0 :(得分:1)

要操纵构面的顺序,您需要根据需要对正在面对的因子的级别进行排序。所以你需要订购data的等级。这可以像df$data <- factor(df$data, levels = c(...))一样完成(在c()中包含您所需的级别顺序)。

关于第二个问题,请查看?facet_wrap,尤其是scales选项。您必须设置scales = 'free''free_y'

要在轴上仅包含整数值,请尝试使用包scales以及labels中的参数scale_y_continuous()。您可以使用包附带的预定义格式之一,也可以定义自己的格式,例如

intfmt <- function(x) format(x, digits = 0)

只会打印数字的整数部分。指定后,您只需在ggplot电话

中添加以下行
+ scale_y_continuous(labels = intfmt)