R中的自动缩放数据

时间:2011-04-18 09:29:18

标签: r scale

我正在使用以下代码在同一图表上绘制两个不同数据的图。它运作良好。但问题是我手动缩放数据。是否可以自动调整它们?

这是我的剧本

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)
)

2 个答案:

答案 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)

enter image description here

答案 1 :(得分:3)

在同一图表上有两条不同比例的线通常被视为不良形式。 (例如,参见Perceptual Edge library中的“图中的双重轴)。”

更好的解决方案是使用两个面板,一个在另一个之上,具有共同的时间轴。最简单的方法是使用ggplot2lattice

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