Автоматическое масштабирование данных в R - PullRequest
4 голосов
/ 18 апреля 2011

Я использую следующий код для построения графиков двух разных данных на одном графике. И это работает хорошо. Но проблема в том, что я вручную масштабирую данные. Можно ли их автоматически масштабировать?

Вот мой сценарий

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 ]

4 голосов
/ 18 апреля 2011

Я согласен с Ричи Коттоном, что наличие двух осей считается плохой формой.

Однако есть альтернативный способ отображения информации, которая является концептуально обоснованной.Это для масштабирования значений от 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] соответствует [мин;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

3 голосов
/ 18 апреля 2011

Наличие двух линий с разными шкалами на одном графике обычно считается плохой формой.(См., Например, «Двойные оси в графиках» в библиотеке Perceptual Edge .)

Лучшим решением было бы иметь две панели, одна над другой, с общейось времениЭто проще всего сделать, используя 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
...