【问题标题】:Multiple line plot in a loop循环中的多条线图
【发布时间】:2016-02-18 13:43:26
【问题描述】:

我有不同国家、不同年份的数据,以及每个国家/地区年份的多个变量的不同值。我正在尝试为每个国家/地区绘制多个多线图(这些线是这些变量/年份)。

由于某些未知原因,运行以下命令时,我得到的图是空的:

par(mfrow=c(5,5))
mysplits<-split(A,A$country)
for (ii in 1:length(mysplits)) {
  adf<-mysplits[[ii]]
  snames<- names(mysplits)[ii]
  p<-plot(1, 
       main=paste(snames),
       type = "n", xlim=c(1993,2015),
       ylab = "value", xlab="years", ylim=c(-50,50))
  lines(adf$year, adf$tone, col = "steelblue", lty=5)
  lines(adf$year, adf$articles, col = "pink", lty=2) 
  lines(adf$year, adf$num, col = "red", lty=3) 
  lines(adf$year, adf$gold, col = "green", lty=6)
  legend("bottomright", legend = c("EPE Public","Tone","Coverage","No of Events",
  "Conflictual"), col = c("black","steelblue","pink","red","green"),
     lty = c(1,5,2,3,6),
     cex = 1.5, seg.len=4)
     }

这是dput(head(A))的输出:

structure(list(X = 1:6, country = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("AU", "BE", "BU", "DA", "EN", "EZ", "FI", 
"FR", "GM", "HR", "HU", "IT", "LG", "LH", "LO", "LU", "MT", "NL", 
"PL", "RO", "SI", "SP", "SW"), class = "factor"), year = 1994:1999, 
gold = c(-0.571428571, -2.4, 1.26, -0.2, -0.966666667, 0.316666667
), tone = c(324L, 239L, 251L, 72L, 61L, 159L), articles = c(3.571428571, 
4.5, 8.2, 4.6, 9.333333333, 6.166666667), num = c(7L, 4L, 
5L, 5L, 6L, 6L), yepe = 1995:2000, couepe = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("AU", "BE", "BU", "DA", "EN", 
"EZ", "FI", "FR", "GM", "HR", "HU", "IT", "LG", "LH", "LO", 
"LU", "MT", "NL", "PL", "RO", "SI", "SP", "SW"), class = "factor"), 
epepub = c(2.01, 1.87, 0.55, 0.63, 0.52, 0.82), epepriv = c(NA, 
NA, 2.63, 2.71, 2.59, 2.12), epeind = c(0.65, 0.66, 0.72, 
0.63, 0.57, 0.53)), .Names = c("X", "country", "year", "gold", 
"tone", "articles", "num", "yepe", "couepe", "epepub", "epepriv", 
"epeind"), row.names = c(NA, 6L), class = "data.frame")

这是我的数据图像:

【问题讨论】:

  • 你有一些我们可以测试的数据吗?
  • 嗨,欢迎来到 StackOverflow。提供一些数据的最简单方法是使用dput(head(a)) 并将其编辑到您的开篇帖子中。在执行此操作之前,请确保您可以使用 head(a) 复制您的问题。另外,空地是什么意思?轴是否仍然显示或一切都是白色的?
  • 尝试相同的脚本,但使用par(mfrow=c(1,1))。如果这确实有效并给出了图,那么问题是您试图在单个显示器上获得太多图。对于par(mfrow=c(5,5)),每个图都没有足够的空间来显示。至少当我尝试运行脚本时似乎会发生这种情况。
  • 将绘图发送到图形设备:pdf('plots.pdf'); par(mfrow=c(5,5)); for (...); dev.off()
  • 我将您的答案转换为编辑。请不要使用答案来为您的问题添加信息。相反,edit 的问题。另外,我修复了你的图像。但请注意,您应该在问题中传递实际数据,而不是数据图像。图片用处不大!

标签: r loops plot


【解决方案1】:

我强烈、强烈、强烈建议在尝试在 R 中进行复杂绘图时远离基本绘图包。Laterow 指出,您的问题在于 par(mfrow=c(5,5)) 调用。而不是尝试调试那里出了什么问题。请考虑使用 ggplot,这是一个更强大、更易读、更灵活的库,用于进行 r 绘图。用 Hadley Wickham 的话来说,~“base R plotting 是用来画图的,ggplot 是用来理解数据的”

例如,我相信您尝试生成的图表可以通过以下方式完成。注意,没有 for 循环。通常,在 R 中,如果您使用 for 循环,则您做错了。另请注意,它的代码行数大约只有一半,并且比您最初编写的代码更具可读性。

library(ggplot2)
ggplot(A, aes(x=year)) + 
  geom_line(aes(y=tone, colour="Tone")) + 
  geom_line(aes(y=articles, colour="Coverage")) + 
  geom_line(aes(y=num, colour="No of Events")) +
  geom_line(aes(y=gold, colour="Conflictual")) + 
  facet_wrap(~country) + 
  scale_colour_manual("Legend", 
                      breaks = c("Tone", "Coverage", "No of Events", "Conflictual"),
                      values = c("steelblue", "pink", "red", "green")) +
  xlab("value") + 
  ylab("years")

生产:

请注意,您的示例数据仅包含“AU”国家/地区的值。然而,无论有多少国家在这个领域,这都会自动包装你的构面。这比必须静态地说 我有 25 个国家/地区更加强大,这似乎是您在最初尝试中所做的。

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 2021-02-12
    • 1970-01-01
    • 2021-12-26
    • 2022-11-23
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多