【问题标题】:Scaling of second data set in ggplot2 line plotggplot2 线图中第二个数据集的缩放
【发布时间】:2019-07-11 17:41:13
【问题描述】:

我想在辅助轴上显示第二个数据集(橙色线,“Annual”),因为它的值远小于第一个数据集(红线,“Cumulative”)的值。我设法重新缩放了辅助 y 轴,但是我在重新缩放第二个数据集时遇到了问题,因为两个数据集是一起读入的,我不知道如何在代码中单独处理第二个数据集。

数据是这样的

年度累计年度 1960 1 1 1961 1 0 1962 1 0 1963 2 1 ... 2019 334 9

我将不胜感激任何建设性的 cmets!

library("ggplot2")
library("reshape2")
library("tidyverse")

sec_scale=1/10
datu_sub=data[,c(2,3,1)]
datu=melt(datu_sub,id=c("Year"))
p1<-ggplot(datu)+geom_line(aes(x=Year,y=value,colour=variable),linetype="solid",size=1.1)+
  geom_point(aes(x=Year,y=value,colour=variable),shape=1,size=3,stroke=1.5)+
  scale_colour_manual(values=c("darkorange","red"))+
  scale_y_continuous(sec.axis=sec_axis(~.*sec_scale,name="Annual\n"))
p1<-p1+labs(x="\nYear",y="Cumulative\n")
p1+theme(axis.title.x=element_text(size=18),
         axis.text.x=element_text(size=14),
         axis.title.y=element_text(size=18),
         axis.text.y=element_text(size=14),
         axis.ticks=element_blank(),
         legend.title=element_blank(),
         legend.position=c(0.12,0.89),
         legend.text=element_text(size=14),
         legend.background=element_rect(fill="white",size=0.5,linetype="dotted"))

【问题讨论】:

  • 如果在您的aes() 通话中使用y=ifelse(variable == "Cumulative", sec_scale, 1) * value) 会有帮助吗?此外,您可以通过在 ggplot() 调用中定义 aes() 来简化生活,而不是在每个 geom 中单独定义,除非有来自不同 data.frames 的绘图数据。
  • 对不起,你能用不同的词来形容吗?我已尝试执行您的建议,但不确定我是否让您写了。

标签: r ggplot2 axis scaling


【解决方案1】:

我无法将所有内容都放在评论中,因此我将其写为答案。我不得不即兴创作一些数据,因为我没有你的可用样本,但绘图代码应该是相似的。

sec_scale=1/10
# I made up some data because I don't have yours
datu <- data.frame(Year = c(2000:2010, 2000:2010),
                   value = c(rnorm(11, 500, 10), rnorm(11, 5000, 100)),
                   variable = rep(c("Annual", "Cumulative"), each = 11))

现在进行绘图,我已将 geoms 中的 mapping/aes() 参数删除到主 ggplot 函数,并且 geoms 将从主 ggplot 调用继承这些映射。

接下来,您会注意到我已经重新定义了y = ifelse(variable == "Cumulative, sec_scale, 1) * value,它将按sec_scale 中的数量缩放variable == "Cumulative" 中的所有values。

p1<-ggplot(datu, aes(x = Year, 
                     y = ifelse(variable == "Annual", 1/sec_scale, 1) * value, 
                     colour = variable)) + 
  geom_line(linetype = "solid", size = 1.1) +
  geom_point(shape = 1, size = 3, stroke = 1.5) +
  scale_colour_manual(values = c("darkorange", "red")) +
  scale_y_continuous(sec.axis = sec_axis(~.*sec_scale,name = "Annual\n")) +
  labs(x="\nYear",y="Cumulative\n") + 
  theme(axis.title.x = element_text(size=18),
        axis.text.x = element_text(size=14),
        axis.title.y = element_text(size=18),
        axis.text.y = element_text(size=14),
        axis.ticks = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.12,0.89),
        legend.text = element_text(size=14),
        legend.background = element_rect(fill="white",size=0.5,linetype="dotted"))

对我来说,情节是这样的:

但是,我想指出,有些人不喜欢辅助轴,因为它们会误导。

【讨论】:

  • 感谢您的帮助!我可以设法将橙色线提升到所需的水平,但是,两个 y 轴都使用因子 1/10 缩小。
  • 除非我有一个可重现的数据示例和您的绘图代码,否则我真的不知道出了什么问题。
  • > 数据 年 年 累计 1 1960 1 1 2 1961 0 1 3 1962 0 1 4 1963 0 1 5 1964 0 1 6 1965 0 1 7 1966 0 1 8 1967 1 2 9 1968 0 2 10 1969 0 2 11 1970 0 2 12 1971 0 2 13 1972 1 3 14 1973 0 3 15 1974 1 4 16 1975 1 5 17 1976 0 5 18 1977 0 5 19 1978 0 9 20 1979 4>
  • 对不起,我无法以编程方式解析 R 中的数据,您介意复制粘贴 dput(head(data)) 而不是复制粘贴 print() 的输出吗?
  • structure(list(Year = 1960:1965, Annual = c(1L, 0L, 0L, 0L, 0L, 0L), 累积 = c(1L, 1L, 1L, 1L, 1L, 1L) )), row.names = c(NA, 6L), class= "data.frame")
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多