facet_wrap标题包装& free_y轴上的小数位(ggplot2)

时间:2016-06-07 01:15:56

标签: r ggplot2 facet-wrap

我有一组使用facet_wrap生成多个图的代码:

ggplot(summ,aes(x=depth,y=expr,colour=bank,group=bank)) +
geom_errorbar(aes(ymin=expr-se,ymax=expr+se),lwd=0.4,width=0.3,position=pd) +
geom_line(aes(group=bank,linetype=bank),position=pd) +
geom_point(aes(group=bank,pch=bank),position=pd,size=2.5) +
scale_colour_manual(values=c("coral","cyan3", "blue")) +
facet_wrap(~gene,scales="free_y") +  
theme_bw()

使用参考数据集,此代码生成如下数字:

multiplot example

我想在这里实现两个目标:

  1. 保持y轴的自动缩放,但请确保在所有图中仅显示1个小数位。我尝试创建一个舍入expr值的新列,但它会导致错误栏无法正确排列。
  2. 我想包装标题。我曾尝试更改Change plot title sizes in a facet_wrap multiplot中的字体大小,但有些基因名称太长,如果我将它们塞进一行,最终会变得太小而无法读取。有没有办法使用facet_wrap语句中的代码包装文本?

3 个答案:

答案 0 :(得分:2)

可能不能作为明确的答案,但这里有一些关于你的问题的指示:

  1. 格式化y轴刻度标签。
  2. 首先,让我们尝试使用format函数的直接解决方案。在这里,我们将所有y轴刻度标签格式化为1个十进制值,然后用round四舍五入。

    formatter <- function(...){
      function(x) format(round(x, 1), ...)
    }
    
    mtcars2 <- mtcars
    sp <- ggplot(mtcars2, aes(x = mpg, y = qsec)) + geom_point() + facet_wrap(~cyl, scales = "free_y")
    sp <- sp + scale_y_continuous(labels = formatter(nsmall = 1))
    

    enter image description here

    问题是,有时这种方法不实用。例如,从你的图中取最左边的图。使用相同的格式,所有y轴刻度标签将向上舍入为-0.3,这是不可取的。

    另一种解决方案是将每个绘图的中断修改为一组舍入值。但是,再次以图中最左边的图表为例,它最终会只有一个标签点-0.3

    另一种解决方案是将标签格式化为科学形式。为简单起见,您可以修改formatter函数,如下所示:

    formatter <- function(...){
      function(x) format(x, ..., scientific = T, digit = 2)
    }
    

    enter image description here

    现在,您可以为所有情节提供统一的格式&#39; y轴。不过,我的建议是在舍入后将标签设置为2位小数。

    1. 包裹分面标题
    2. 可以使用labeller中的facet_wrap参数完成此操作。

      # Modify cyl into factors
      mtcars2$cyl <- c("Four Cylinder", "Six Cylinder", "Eight Cylinder")[match(mtcars2$cyl, c(4,6,8))]
      
      # Redraw the graph
      sp <- ggplot(mtcars2, aes(x = mpg, y = qsec)) + geom_point() +
        facet_wrap(~cyl, scales = "free_y", labeller = labeller(cyl = label_wrap_gen(width = 10)))
      sp <- sp + scale_y_continuous(labels = formatter(nsmall = 2))
      

      enter image description here

      必须注意的是,wrap函数会检测空格以将标签分隔成行。因此,在您的情况下,您可能需要修改变量。

答案 1 :(得分:1)

这只解决了问题的第一部分。您可以创建一个函数来格式化轴并使用scale_y_continous进行调整。

df <- data.frame(x=rnorm(11), y1=seq(2, 3, 0.1) + 10, y2=rnorm(11))

library(ggplot2)
library(reshape2)

df <- melt(df, 'x')

# Before
ggplot(df, aes(x=x, y=value)) + geom_point() +
  facet_wrap(~ variable, scale="free")

enter image description here

# label function
f <- function(x){
  format(round(x, 1), nsmall=1)
}

# After
ggplot(df, aes(x=x, y=value)) + geom_point() +
  facet_wrap(~ variable, scale="free") +
  scale_y_continuous(labels=f)

enter image description here

答案 2 :(得分:0)

scale_*_continuous(..., labels = function(x) sprintf("%0.0f", x)) 对我有用。