使用带有facet_wrap的ggplot2显示不同的轴标签

时间:2016-06-01 15:39:29

标签: r ggplot2

我有一个时间序列,包含不同的变量和不同的单位,我想在同一个地块上显示。

ggplot不支持多轴(as explained here),因此我按照建议尝试使用构面绘制曲线:

x <- seq(0, 10, by = 0.1)
y1 <- sin(x)
y2 <- sin(x + pi/4)
y3 <- cos(x)

my.df <- data.frame(time = x, currentA = y1, currentB = y2, voltage = y3)
my.df <- melt(my.df, id.vars = "time")
my.df$Unit <- as.factor(rep(c("A", "A", "V"), each = length(x)))

ggplot(my.df, aes(x = time, y = value)) + geom_line(aes(color = variable)) + facet_wrap(~Unit, scales = "free_y", nrow = 2)

结果如下: enter image description here

事情是,只有一个y标签,说&#34;价值&#34;我想要两个:一个用#34; Currents(A)&#34;另一个用&#34;电压(V)&#34;。

这可能吗?

3 个答案:

答案 0 :(得分:31)

ggplot2_2.2.1 中,您可以使用strip.position中的facet_wrap参数将面板条移动为y轴标签。但是,使用此方法不会有条带标签和不同的y轴标签,这可能并不理想。

一旦您将条带标签放在y轴(“左侧”)上,您可以通过将一个命名向量提供给labeller来更改标签,以用作查找表。

条形标签可以通过strip.placement中的theme移到y轴之外。

删除条带背景和y轴标签,以获得具有两个窗格和不同y轴标签的最终图形。

ggplot(my.df, aes(x = time, y = value) ) + 
     geom_line( aes(color = variable) ) + 
     facet_wrap(~Unit, scales = "free_y", nrow = 2, 
                strip.position = "left", 
                labeller = as_labeller(c(A = "Currents (A)", V = "Voltage (V)") ) )  +
     ylab(NULL) +
     theme(strip.background = element_blank(),
           strip.placement = "outside")

enter image description here 从顶部卸下条带使两个窗格非常靠近。要更改可以添加的间距,例如panel.margin = unit(1, "lines")theme

答案 1 :(得分:5)

这是一个手动解决方案,使用其他方法可以更快,更轻松地解决这个问题:

plot

如果您真的需要,使用边距和实验室将允许您坚持2图。

         3751 function calls (3694 primitive calls) in 9.110 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    2.158    2.158    2.158    2.158 {pandas.algos.groupby_indices}
        2    1.214    0.607    1.214    0.607 {pandas.algos.take_2d_axis1_float64_float64}
        1    1.017    1.017    1.017    1.017 {method 'sort' of 'numpy.ndarray' objects}
        4    0.859    0.215    0.859    0.215 {method 'take' of 'numpy.ndarray' objects}
        2    0.586    0.293    0.586    0.293 {pandas.algos.take_2d_axis1_int64_int64}
        1    0.534    0.534    0.534    0.534 {pandas.algos.take_1d_int64_int64}
        1    0.420    0.420    0.420    0.420 {built-in method pandas.algos.ensure_object}
        1    0.395    0.395    0.395    0.395 {method 'get_labels' of 'pandas.hashtable.Int64HashTable' objects}
        1    0.349    0.349    0.349    0.349 {pandas.algos.groupsort_indexer}
        2    0.324    0.162    0.340    0.170 indexing.py:1794(maybe_convert_indices)
        2    0.223    0.112    3.109    1.555 internals.py:3625(take)
        1    0.129    0.129    0.129    0.129 {built-in method numpy.core.multiarray.concatenate}
        1    0.124    0.124    9.109    9.109 <string>:2(<module>)
        1    0.124    0.124    0.124    0.124 {method 'copy' of 'numpy.ndarray' objects}
        1    0.086    0.086    0.086    0.086 {pandas.lib.generate_slices}
       31    0.083    0.003    0.083    0.003 {method 'reduce' of 'numpy.ufunc' objects}
        1    0.076    0.076    0.710    0.710 algorithms.py:156(factorize)
        5    0.074    0.015    2.415    0.483 common.py:733(take_nd)
        1    0.067    0.067    0.068    0.068 numeric.py:2476(array_equal)
        1    0.063    0.063    8.985    8.985 groupby.py:3523(filter)
        1    0.062    0.062    2.640    2.640 groupby.py:4300(_groupby_indices)
       10    0.059    0.006    0.059    0.006 common.py:250(_isnull_ndarraylike)
        1    0.030    0.030    0.030    0.030 {built-in method numpy.core.multiarray.putmask}

答案 2 :(得分:1)

超级迟到的条目,但是自己解决了...让您保留所有strip.text的超级简单的技巧是在ylab(" Voltage (V) Current (A)\n")中输入一堆空格以放置标题跨两个情节。您可以使用axis.title.y = element_text(hjust = 0.25)左对齐以使所有内容对齐。

library(tidyverse)
library(reshape2)
x <- seq(0, 10, by = 0.1)
y1 <- sin(x)
y2 <- sin(x + pi / 4)
y3 <- cos(x)

my.df <-
    data.frame(
        time = x,
        currentA = y1,
        currentB = y2,
        voltage = y3
    )
my.df <- melt(my.df, id.vars = "time")
my.df$Unit <- as.factor(rep(c("A", "A", "V"), each = length(x)))

ggplot(my.df, aes(x = time, y = value)) + 
    geom_line(aes(color = variable)) + 
    facet_wrap( ~Unit, scales = "free_y", nrow = 2) +
    ylab("             Voltage (V)                                          Current (A)\n") +
    theme(
        axis.title.y = element_text(hjust = 0.25)
    )
ggsave("Volts_Amps.png",
       height = 6,
       width = 8,
       units = "in",
       dpi = 600)

enter image description here