Graphics 如何使用很少的命令绘制漂亮的图形,将绘图逻辑与布局分离?

Graphics 如何使用很少的命令绘制漂亮的图形,将绘图逻辑与布局分离?,graphics,r,plot,Graphics,R,Plot,有没有一种简单的方法可以在不使用许多命令的情况下,在R中绘制出以下数据的漂亮曲线图 Region1 Region2 2007 17 55 2008 26 43 2009 53 70 2010 96 58 我确实知道如何绘制数据,但它使用了太多的命令和参数,结果看起来仍然非常糟糕,请参见: 您可能需要阅读helppar,它是定制标准R图的非常有用的信息源。这允许您 具有更紧的外边缘,例如parmar=c3,3,1,1 更改字体,例如parcex=0.7或某些更具体的cex替代方案 设置颜色或线

有没有一种简单的方法可以在不使用许多命令的情况下,在R中绘制出以下数据的漂亮曲线图

 Region1 Region2
2007 17 55
2008 26 43
2009 53 70
2010 96 58
我确实知道如何绘制数据,但它使用了太多的命令和参数,结果看起来仍然非常糟糕,请参见:


您可能需要阅读helppar,它是定制标准R图的非常有用的信息源。这允许您

具有更紧的外边缘,例如parmar=c3,3,1,1 更改字体,例如parcex=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> 

是的,我有偏见地认为,最好使用ggplot2软件包来创建图形。多亏了Dirk提供了一个示例数据集,下面介绍了如何使用数据

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

在我看来,对哈德利所建议的图形的一个稍微改进的版本。我认为现在它与您试图复制的原始图形非常相似,实际上,使用直接标签可以更好地复制

按照哈德利的建议转换数据后

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)
这是一个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()
它生成以下图形:

这与Keynote绘制的图形非常接近:

谢谢你的提示,我已经安装好了。虽然它在某种程度上简化了命令,并具有一些很酷的功能,但似乎仍然很难使图形看起来像我上面给出的Keynote figure链接中那样漂亮。。。我想我必须继续玩它。事实上,我认为通过更仔细地研究ggplot2,你将能够创建任何你需要的东西。我也用它来做出版物质量的报道。如果你的重点是漂亮,就坚持基调吧?R图总是比注释记号图更容易变得漂亮。R和ggplot的优势在于,您可以尝试多种不同的可能性,以找到最能揭示数据有趣和重要特征的图形。
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)
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