我正在使用以下代码在同一图表上绘制两个不同数据的图。它运作良好。但问题是我手动缩放数据。是否可以自动调整它们?
这是我的剧本
gales <- read.table("input", header=TRUE)
attach(gales)
par(mar=c(5,4,4,4)+0.1)
plot(year,number,type="l",lwd=2,las=1, col="red")
title(main = list("Title", cex=1.5,
col="red", font=3))
par(new=T)
plot(year,feb,type="l",lwd=2, las=1,axes=F,ylab="",col="blue")
axis(4,las=1)
mtext(side=4,line=2.5,"feb")
这是我的数据
year number feb
1950 600 20
1951 1200 5
1952 900 5
1953 800 5
1954 800 5
1955 1100 20
1956 600 6
1957 900 10
1958 1200 20
1959 1200 20
1960 800 6
1961 900 6
1962 800 10
1963 1200 20
1964 900 15
1965 600 10
1966 600 10
1967 600 10
1968 600 10
1969 600 10
1970 1200 20
gales <- structure(list(
year = 1950:1970,
number = c(600L, 1200L, 900L, 800L, 800L, 1100L, 600L, 900L, 1200L, 1200L, 800L, 900L, 800L, 1200L, 900L, 600L, 600L, 600L, 600L, 600L, 1200L),
feb = c(20L, 5L, 5L, 5L, 5L, 20L, 6L, 10L, 20L, 20L, 6L, 6L, 10L, 20L, 15L, 10L, 10L, 10L, 10L, 10L, 20L)),
.Names = c("year", "number", "feb"), class = "data.frame", row.names = c(NA, -21L)
)
答案 0 :(得分:4)
我同意Richie Cotton的说法,认为有两个轴是不好的形式。
但是,有一种显示概念上合理的信息的替代方法。这是为了缩放0到1之间的值。
以下是使用ggplot
的示例。
library(reshape2)
library(ggplot2)
gales <- structure(list(
year = 1950:1970,
number = c(600L, 1200L, 900L, 800L, 800L, 1100L, 600L, 900L, 1200L, 1200L, 800L, 900L, 800L, 1200L, 900L, 600L, 600L, 600L, 600L, 600L, 1200L),
feb = c(20L, 5L, 5L, 5L, 5L, 20L, 6L, 10L, 20L, 20L, 6L, 6L, 10L, 20L, 15L, 10L, 10L, 10L, 10L, 10L, 20L)),
.Names = c("year", "number", "feb"), class = "data.frame", row.names = c(NA, -21L)
)
定义一个函数,该函数将在[0; 1]对应于[min; MAX]
range01 <- function(x){(x-min(x))/(max(x)-min(x))}
gales$number <- range01(gales$number)
gales$feb <- range01(gales$feb)
将数据融合为适合在ggplot
mgales <- melt(gales, id.vars="year")
创建情节
ggplot(mgales, aes(x=year, y=value, group=variable, colour=variable)) +
geom_line(size=2)
答案 1 :(得分:3)
在同一图表上有两条不同比例的线通常被视为不良形式。 (例如,参见Perceptual Edge library中的“图中的双重轴)。”
更好的解决方案是使用两个面板,一个在另一个之上,具有共同的时间轴。最简单的方法是使用ggplot2
或lattice
。
ggplot2解决方案:
library(ggplot2)
gales_long <- melt(gales, id.vars = "year")
p_gales_ggplot2 <- ggplot(gales_long, aes(year, value)) +
geom_line() +
facet_grid(variable ~ ., scales = "free_y")
p_gales_ggplot2
格子解决方案:
p_gales_lattice <- xyplot(
value ~ year | variable,
gales_long,
type = "l",
scales = list(y = list(relation = "free")),
layout = c(1, 2)
)
p_gales_lattice