【问题标题】:Use different scale in each facet and set a different facet order在每个方面使用不同的比例并设置不同的方面顺序
【发布时间】:2014-07-12 16:10:01
【问题描述】:

我有一个 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 - 当我绘制时,面的顺序由值“数据”定义。 SNR=10 的字符串位于 SNR=2 的字符串之前。我想在 SNR=10 之前获得 SNR=2 的数据

2- 我希望每个方面都有不同的比例。 (现在在每个方面 y 从 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 代码。我已经尝试过 scales 包,但我不明白如何在我的情况下使用它。

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

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

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

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

    只会打印数字的整数部分。指定后,您只需将以下行添加到您的 ggplot 调用

    + scale_y_continuous(labels = intfmt)
    

    【讨论】:

    • 免费 y 选项有效。订单的问题是我有很多级别。我不能一一指定。
    • sort 将不起作用,因为您正在排序字符串而不是数字,并且字符串“10”在“2”之前。因此,您要么必须手动指定它,要么必须编写一个 for 循环,按您想要的顺序打印它们,然后将其复制粘贴到您的代码中。除了使用 as.numeric 之外,我不知道如何对这些字符串进行排序,就像它们是数字一样进行排序,这在您的情况下不起作用,因为您的文本与数字混合在一起。
    • 这可以通过 scales 包来完成 - 请参阅更新的答案。
    • 抱歉,我不明白如何在我的情况下使用秤。我的整个代码现在都在问题中。
    • 对不起,我还是不开心。通过这种方式,1.5 值被 1 替换。所以在 y 轴上我有标签 0、0、1、1、2 ...。我只想有 0、1、2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2012-04-17
    • 2013-06-20
    • 1970-01-01
    • 2019-01-17
    • 2020-08-27
    相关资源
    最近更新 更多