绘制两个具有不同 y 轴的时间序列:一个作为点图(或条形图),另一个作为线
Plot two time series with different y-axes: one as a dot plot (or a bar plot) and the other as a line
我有两个时间序列数据,每个都有不同的值范围。我想将一个绘制为点图,将另一个绘制为点图上的一条线。 (我会选择一个看起来不错的条形图和条形图上的一条线,但我更喜欢点图。)
#make some data
require(lubridate)
require(ggplot)
x1 <- sample(1990:2010, 10, replace=F)
x1 <- paste(x1, "-01-01", sep="")
x1 <- as.Date(x1)
y1 <- sample(1:10, 10, replace=T)
data1 <- cbind.data.frame(x1, y1)
year <- sample(1990:2010, 10, replace=F)
month <- sample(1:9, 10, replace=T)
day <- sample(1:28, 10, replace=T)
x2 <- paste(year, month, day, sep="-")
x2 <- as.Date(x2)
y2 <- sample(100:200, 10, replace=T)
data2 <- cbind.data.frame(x2, y2)
data2 <- data2[with(data2, order(x2)), ]
# frequency data for dot plot
x3 <- sample(1990:2010, 25, replace=T)
data2 <- as.data.frame(x3)
我可以在 ggplot 中用一组数据制作点图或条形图:
ggplot() + geom_dotplot(data=data2, aes(x=x3))
ggplot() + geom_bar(data=data, aes(x=x1, y=y1), stat="identity")
但我无法叠加第二个数据集,因为 ggplot 不允许使用第二个 y 轴。
我不知道如何使用 barplot() 绘制时间序列。
我可以使用 plot() 将第一组数据绘制为 "h" 类型的图,并将第二组数据添加为一条线,但我不能使条形变粗,因为每一个都对应多年中的一天,我认为这很丑陋。
plot(data$x1, data$y1, type="h")
par(new = T)
plot(data2$x2, data2$y2, type="l", axes=F, xlab=NA, ylab=NA)
axis(side=4)
有什么想法吗?我唯一剩下的想法是制作两个单独的图并将它们叠加在图形程序中。 :/
我删除了原来的答案。
要回答有关制作点图的问题,您可以重新排列数据,以便可以使用基本绘图功能。一个例子:
使用 chron 包进行绘图:
library(chron)
虚拟数据:
count.data <- data.frame("dates" = c("1/27/2000", "3/27/2000", "6/27/2000", "10/27/2000"), "counts" = c(3, 10, 5, 1), stringsAsFactors = F)
复制列表中的日期:
rep.dates <- sapply(1:nrow(count.data), function(x) rep(count.data$dates[x], count.data$counts[x]))
将计数转换为序列:
seq.counts <- sapply(1:nrow(count.data), function(x) seq(1, count.data$counts[x], 1))
画出来:
plot(as.chron(rep.dates[[1]]), seq.counts[[1]], xlim = c(as.chron("1/1/2000"), as.chron("12/31/2000")),
ylim = c(0, 20), pch = 20, cex = 2)
for(i in 2:length(rep.dates)){
points(as.chron(rep.dates[[i]]), seq.counts[[i]], pch = 20, cex = 2)
}
一个简单的解决方法是跟随您的 base
密谋直觉,并为 type='h'
加强 lwd
。请务必设置 lend=1
以防止圆角线:
par(mar=c(5, 4, 2, 5) + 0.1)
plot(data1, type='h', lwd=20, lend=1, las=1, xlab='Date', col='gray',
xlim=range(data1$x1, data2$x2))
par(new=TRUE)
plot(data2, axes=FALSE, type='o', pch=20, xlab='', ylab='', lwd=2,
xlim=range(data1$x1, data2$x2))
axis(4, las=1)
mtext('y2', 4, 3.5)
我有两个时间序列数据,每个都有不同的值范围。我想将一个绘制为点图,将另一个绘制为点图上的一条线。 (我会选择一个看起来不错的条形图和条形图上的一条线,但我更喜欢点图。)
#make some data
require(lubridate)
require(ggplot)
x1 <- sample(1990:2010, 10, replace=F)
x1 <- paste(x1, "-01-01", sep="")
x1 <- as.Date(x1)
y1 <- sample(1:10, 10, replace=T)
data1 <- cbind.data.frame(x1, y1)
year <- sample(1990:2010, 10, replace=F)
month <- sample(1:9, 10, replace=T)
day <- sample(1:28, 10, replace=T)
x2 <- paste(year, month, day, sep="-")
x2 <- as.Date(x2)
y2 <- sample(100:200, 10, replace=T)
data2 <- cbind.data.frame(x2, y2)
data2 <- data2[with(data2, order(x2)), ]
# frequency data for dot plot
x3 <- sample(1990:2010, 25, replace=T)
data2 <- as.data.frame(x3)
我可以在 ggplot 中用一组数据制作点图或条形图:
ggplot() + geom_dotplot(data=data2, aes(x=x3))
ggplot() + geom_bar(data=data, aes(x=x1, y=y1), stat="identity")
但我无法叠加第二个数据集,因为 ggplot 不允许使用第二个 y 轴。
我不知道如何使用 barplot() 绘制时间序列。
我可以使用 plot() 将第一组数据绘制为 "h" 类型的图,并将第二组数据添加为一条线,但我不能使条形变粗,因为每一个都对应多年中的一天,我认为这很丑陋。
plot(data$x1, data$y1, type="h")
par(new = T)
plot(data2$x2, data2$y2, type="l", axes=F, xlab=NA, ylab=NA)
axis(side=4)
有什么想法吗?我唯一剩下的想法是制作两个单独的图并将它们叠加在图形程序中。 :/
我删除了原来的答案。
要回答有关制作点图的问题,您可以重新排列数据,以便可以使用基本绘图功能。一个例子:
使用 chron 包进行绘图:
library(chron)
虚拟数据:
count.data <- data.frame("dates" = c("1/27/2000", "3/27/2000", "6/27/2000", "10/27/2000"), "counts" = c(3, 10, 5, 1), stringsAsFactors = F)
复制列表中的日期:
rep.dates <- sapply(1:nrow(count.data), function(x) rep(count.data$dates[x], count.data$counts[x]))
将计数转换为序列:
seq.counts <- sapply(1:nrow(count.data), function(x) seq(1, count.data$counts[x], 1))
画出来:
plot(as.chron(rep.dates[[1]]), seq.counts[[1]], xlim = c(as.chron("1/1/2000"), as.chron("12/31/2000")),
ylim = c(0, 20), pch = 20, cex = 2)
for(i in 2:length(rep.dates)){
points(as.chron(rep.dates[[i]]), seq.counts[[i]], pch = 20, cex = 2)
}
一个简单的解决方法是跟随您的 base
密谋直觉,并为 type='h'
加强 lwd
。请务必设置 lend=1
以防止圆角线:
par(mar=c(5, 4, 2, 5) + 0.1)
plot(data1, type='h', lwd=20, lend=1, las=1, xlab='Date', col='gray',
xlim=range(data1$x1, data2$x2))
par(new=TRUE)
plot(data2, axes=FALSE, type='o', pch=20, xlab='', ylab='', lwd=2,
xlim=range(data1$x1, data2$x2))
axis(4, las=1)
mtext('y2', 4, 3.5)