如何创建具有双轴的条形图?
how to create a bar chart with a dual axis?
考虑这个简单的例子
library(lubridate)
library(lattice)
library(latticeExtra)
library(tibble)
library(dplyr)
mydf <- tibble(time = c(ymd('2019-01-01'),
ymd('2019-01-02'),
ymd('2019-01-03'),
ymd('2019-01-04'),
ymd('2019-01-05')),
var1 = c(2,2,2,2,1),
var2 = c(2,1,1,4,5),
var3 = c(200, 200, 400, 500, 230))
现在可以了
p1 <- mydf %>%
barchart(var1 + var2 ~ time,
data = .,
stack = TRUE,
horiz = FALSE,
par.settings = simpleTheme(col = c('red', 'blue'),
fill = c('red', 'blue'),
alpha = c(0.2)),
auto.key = TRUE)
这也有效
p2 <- mydf %>%
xyplot(var3 ~ time, data = ., type = 'l')
但是,将它们与 latticeExtra::doubleYscale()
结合使用是行不通的。线条不可见(见下文)
latticeExtra::doubleYScale(p1, p2, use.style = FALSE)
奇怪的是,双 y 刻度在那里,但是线不见了。有什么想法吗?
谢谢!!
使用 ggplot2,您可以:
library(tidyr)
library(ggplot2)
df1 <- mydf %>%
select(-var3) %>%
pivot_longer(
cols = c(var1, var2),
names_to = "type",
values_to = "value"
)
df2 <- mydf %>%
select(time, var3)
ggplot(df1) +
geom_col(aes(x = time, y = value, fill = type)) +
geom_line(data = df2, aes(x = time, y = var3/100), size = 2) +
ylab("var1, var2") +
scale_y_continuous(sec.axis = sec_axis(~.*100, name = "var3"))
我稍微简化了你的数据。
使用 as.layer
(也来自 latticeExtra
)而不是 doubleYScale
:
library(lattice)
library(latticeExtra)
mydf <- data.frame(t=1:5,x=c(2,2,2,2,1),
y=c(2,1,1,4,5),z=c(200,200,400,500,230))
p1 <- barchart(x+y~t,mydf,stack=TRUE,horiz=FALSE,
par.settings = simpleTheme(col = c('red', 'blue'),
fill = c('red', 'blue'),
alpha = c(0.2)),
auto.key = TRUE)
p2 <- xyplot(z~t,mydf,type="l")
p1+as.layer(p2,x.same=TRUE,y.same=FALSE,outside=TRUE)
我相信它也适用于润滑过的物体和杂物。
编辑:澄清 as.layer
也在 latticeExtra
包中并添加情节。
考虑这个简单的例子
library(lubridate)
library(lattice)
library(latticeExtra)
library(tibble)
library(dplyr)
mydf <- tibble(time = c(ymd('2019-01-01'),
ymd('2019-01-02'),
ymd('2019-01-03'),
ymd('2019-01-04'),
ymd('2019-01-05')),
var1 = c(2,2,2,2,1),
var2 = c(2,1,1,4,5),
var3 = c(200, 200, 400, 500, 230))
现在可以了
p1 <- mydf %>%
barchart(var1 + var2 ~ time,
data = .,
stack = TRUE,
horiz = FALSE,
par.settings = simpleTheme(col = c('red', 'blue'),
fill = c('red', 'blue'),
alpha = c(0.2)),
auto.key = TRUE)
这也有效
p2 <- mydf %>%
xyplot(var3 ~ time, data = ., type = 'l')
但是,将它们与 latticeExtra::doubleYscale()
结合使用是行不通的。线条不可见(见下文)
latticeExtra::doubleYScale(p1, p2, use.style = FALSE)
奇怪的是,双 y 刻度在那里,但是线不见了。有什么想法吗?
谢谢!!
使用 ggplot2,您可以:
library(tidyr)
library(ggplot2)
df1 <- mydf %>%
select(-var3) %>%
pivot_longer(
cols = c(var1, var2),
names_to = "type",
values_to = "value"
)
df2 <- mydf %>%
select(time, var3)
ggplot(df1) +
geom_col(aes(x = time, y = value, fill = type)) +
geom_line(data = df2, aes(x = time, y = var3/100), size = 2) +
ylab("var1, var2") +
scale_y_continuous(sec.axis = sec_axis(~.*100, name = "var3"))
我稍微简化了你的数据。
使用 as.layer
(也来自 latticeExtra
)而不是 doubleYScale
:
library(lattice)
library(latticeExtra)
mydf <- data.frame(t=1:5,x=c(2,2,2,2,1),
y=c(2,1,1,4,5),z=c(200,200,400,500,230))
p1 <- barchart(x+y~t,mydf,stack=TRUE,horiz=FALSE,
par.settings = simpleTheme(col = c('red', 'blue'),
fill = c('red', 'blue'),
alpha = c(0.2)),
auto.key = TRUE)
p2 <- xyplot(z~t,mydf,type="l")
p1+as.layer(p2,x.same=TRUE,y.same=FALSE,outside=TRUE)
我相信它也适用于润滑过的物体和杂物。
编辑:澄清 as.layer
也在 latticeExtra
包中并添加情节。