Как построить хороший график, используя несколько команд, отделяя логику рисования от макета? - PullRequest
2 голосов
/ 09 января 2010

Есть ли простой способ составить хороший график следующих данных в R без использования многих команд?

 Region1 Region2
2007 17 55
2008 26 43
2009 53 70
2010 96 58

Я знаю, как построить данные, но он использует слишком много команд и параметров, и результат все равно выглядит совершенно ужасно (см. здесь ):

> test <- read.table("/tmp/data.txt")
> png(filename="/tmp/test.png", height=1000, width=750, bg="white", res=300)
> plot(test$Region1, type="b", col="blue", ylim=c(0,100), lwd=3)
> lines(test$Region2, type="b", col="red", lwd=3)
> dev.off()

Мне потребовалось некоторое время, чтобы выяснить все команды, и мне все еще нужно получить метки оси x (2007, 2008, ...), используя команду axis (но как мне получить доступ к test метки оси х?) и т. д.

В Keynote (или Powerpoint) я могу просто дать ему ту же таблицу (транспонированную), и из нее получится хороший график (см. здесь ).

Мой вопрос действительно такой: есть ли команда более высокого уровня, которая хорошо рисует такие типичные данные? Кроме того, как я могу отделить логику рисования (нарисовать 2 линии от этих конкретных данных и т. Д.) От макета (использовать определенные цвета и типы линий для графика и т. Д.)? В идеале, я надеюсь, что есть разные библиотеки для разных макетов графика, например. называется NiceKeynoteLayout, который я мог бы просто использовать следующим образом (или подобным):

> d <- read.table("/tmp/data.txt")
> png <- png(filename="/tmp/test.png", height=1000, width=750)
> myLayout <- loadPredefinedLayout("NiceKeynoteLayout")
> coolplot(d, layout=myLayout, out=png)

Ответы [ 4 ]

3 голосов
/ 10 января 2010

Да, и, на мой взгляд, лучше всего использовать пакет ggplot2 для создания графики. Вот как вы можете это сделать с вашими данными (спасибо Дирку за предоставленный образец набора данных)

data <- data.frame(Year=seq(as.Date("2007-01-01"), 
                   as.Date("2010-01-01"), by="year"), 
                 Region1=c(17,26,53,96), Region2=c(55,43,70,58))

library(ggplot2)

# Convert data to a form optimised for visualisation, not
# data entry
data2 <- melt(data, measure = c("Region1", "Region2"))

# Define the visualisation you want
ggplot(data2, aes(x = Year, y = value, colour = variable)) + 
  geom_line()
2 голосов
/ 12 января 2010

Вот код R, который хорошо отображает данные (это не простой код, как требуется, но, по крайней мере, результат выглядит хорошо):

test <- read.table("/tmp/test.txt", header=TRUE)
png(filename="/tmp/test.png", height=750, width=1000, 
    bg="white", res=300)
par(mar=c(2.5,2.5,0.75,0.75), 
    family="Gill Sans", font=1, # font 2 would be bold
    cex=0.75, cex.lab=0.75, cex.axis=0.75) 
mymax <- max(test$Region1, test$Region2)*1.25

plot(test$Region1, type="b", col="#304E67", 
     ylim=c(0, mymax), lwd=3,
     bty="l", axes=FALSE, ann=FALSE, cex=1.0, tck=1)

axis(1, lwd.ticks=0, at=1:length(test$Year), lab=test$Year)
axis(2, lwd=0, las=1, at=c(0,25,50,75,100), yaxp=c(0,100,4))
# grid(nx = NA, ny = 5, col = "lightgray") # wrong, see axTicks
for(y in c(25, 50, 75, 100)) {
  lines(rep(y, length(test$Region1)), type="l", col="lightgray", lwd=1)
}

lines(test$Region1, type="b", col="#304E67", lwd=3)
lines(test$Region2, type="b", col="#974449", lwd=3)

# title(xlab="Year", col.lab=rgb(0,0.5,0))
# title(ylab="Output", col.lab=rgb(0,0.5,0))
legend(1, mymax+8, c("Region 1","Region 2"), cex=0.75, 
       col=c("#304E67" ,"#974449"), 
       pch=1:1, # circles
       lty=1:1, # solid 
       lwd=1.5, # line width
       bty="n") # no box around

dev.off()

Файл данных имеет следующее содержание:

Year Region1 Region2
2007 17 55
2008 26 43
2009 53 70
2010 96 58

Создает следующий график: http://i46.tinypic.com/206gchk.png/

, который довольно близко подходит к графику, который рисует Keynote:

0 голосов
/ 11 января 2010

A (на мой взгляд) слегка улучшенная версия графики, предложенная Хэдли. Я думаю, что теперь это очень похоже на оригинальную графику, которую вы пытались воспроизвести (даже лучше, на самом деле, с прямыми метками).

После преобразования данных в соответствии с предложением Хэдли,

plot <- ggplot(data2, aes(Year, value, group = variable,
     colour = variable)) + geom_line(size = 1) +
     opts(legend.position = "none")
plot <- plot + geom_point () + opts(legend.position = "none")
plot + geom_text(data = data2[data2$year == 2010,
     ], aes(label = variable), hjust = 1.2, vjust = 1)
0 голосов
/ 09 января 2010

Вы можете прочитать о help(par), который является очень полезным источником информации для настройки стандартных R-графиков. Это позволяет вам

  • имеют более узкие внешние поля (например, par(mar=c(3,3,1,1))
  • изменить шрифты (например, par(cex=0.7) или некоторые из более конкретных альтернатив cex
  • установить цвета или типы линий
  • ...

все это приближается к вашей желаемой loadPredefinedLayout() функциональности, которую вы желаете.

Наконец, для осей лучше использовать класс с учетом времени, такой как zoo, или явно указать аргумент оси x, как в примере ниже:

R> data <- data.frame(Year=seq(as.Date("2007-01-01"), \
                   as.Date("2010-01-01"), by="year"), \
                 Region1=c(17,26,53,96), Region2=c(55,43,70,58))
R> data
        Year Region1 Region2
1 2007-01-01      17      55
2 2008-01-01      26      43
3 2009-01-01      53      70
4 2010-01-01      96      58
R> par(mar=c(3,4,1,1)) 
R> plot(data$Year, data$Region1, type='l', col='blue', ylab="Values")
R> lines(data$Year, data$Region2, col='red')
R> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...