我有一个时间序列,包含不同的变量和不同的单位,我想在同一个地块上显示。
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)
事情是,只有一个y标签,说&#34;价值&#34;我想要两个:一个用#34; Currents(A)&#34;另一个用&#34;电压(V)&#34;。
这可能吗?
答案 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")
从顶部卸下条带使两个窗格非常靠近。要更改可以添加的间距,例如panel.margin = unit(1, "lines")
到theme
。
答案 1 :(得分:5)
这是一个手动解决方案,使用其他方法可以更快,更轻松地解决这个问题:
如果您真的需要,使用边距和实验室将允许您坚持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)