首页 > 解决方案 > 线图 - 使用 R 的年份列与其他列

问题描述

我正在研究一个用例来使用 R 实现附加的预期输出(忽略图例名称的对齐)。

在此处输入图像描述

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


#Creating a dataframe with use-case specific variables. (Missing values are intentional to replicate real-time data)
df = data.frame(
                Year = 2006:2025,

                Survey = c(40.5, 39.0, NA, NA, NA, NA, 29.9, NA, NA, NA, 21.6,
                             NA, NA, NA, NA, NA, NA, NA, NA, NA),

                WhatIf = c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
                             NA, NA, NA, NA, NA, NA, NA, NA, 14.9),

                AARR = c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
                             NA, NA, NA, NA, NA, NA, NA, NA, 13.0),

                Current = c(NA, NA, NA, NA, NA, NA, 29.9, 27.6, 25.4, 23.4, 21.6,
                             19.9, 18.4, 16.9, 15.6, 14.4, 13.3, NA, 12.2, 11.3)
                  )

# Method 1

#Data transformation using melt package
# df_long <- melt(df,id.vars = "Year")
#
# ggplot(data=df_long,aes(x=Year,y=value, colour=variable)) +geom_line() +
#   theme(legend.position="bottom")

#Method 2

#Plot and adding lines - Year vs. rest of the columns
plot(df$Year, df$Survey, type = "o", col = "dark grey", pch = "o", lty = 1, ylim = c(0,max(df$Survey, na.rm = T)), ylab = "Survey")

points(df$Year, df$WhatIf, col="orange" )
lines(df$Year, df$WhatIf, col="orange",lty=2)

points(df$Year, df$AARR, col="black")
lines(df$Year, df$AARR, col="black", lty=2)

points(df$Year, df$Current, col="dark blue")
lines(df$Year, df$Current, col="dark blue", lty=2)

legend(1, 100, legend=c("Survey","WhatIf", "AARR","Current"),
       col=c("dark grey","orange","black", "dark blue"),
       lty=c(1,2,2,2), ncol=1)

由 reprex 包(v0.3.0)于 2020-06-30 创建

我在 R 中尝试了两种方法来模拟带有图例和两个 y 轴的基本图,但不幸的是,我无法产生预期的输出。因此,Current、WhatIf、AARR列将是具有不同颜色的虚线,而Survey列由符号 表示"o"

在此处输入图像描述

非常感谢有关该方法的任何建议。

标签: rggplot2

解决方案


正如所指出的那样,您最初的问题不是很清楚您在情节和代码的哪个方面遇到问题。但是,阅读您的问题和回复评论,您似乎正在寻找复制您附加的图像/图,它似乎在点之间有一些空格(由 NA 值分隔),但还有一些其他关键元素:

  1. 辅助 y 轴
  2. 带有图例定位和轴标签的一些特定格式
  3. 将标记点的线格式化为虚线和空心圆圈

这是我想出的代码,用于复制我所理解的是您想要的情节。然后,我将解释一下我过去是如何ggplot2配置上面指出的一些元素的。

ggplot(df_long, aes(x=Year, y=value, color=variable)) +
  theme_classic() +
  
  # data plotting layers
  geom_line(linetype='dashed', size=1) +
  geom_point(shape=21, size=3, fill='white') +
  
  # scale elements
  scale_y_continuous(
    breaks=seq(0,100, 10), labels = seq(0, 100, 10), limits=c(0,70), expand=expansion(mult=0.02),
    sec.axis = sec_axis(
      name='Stunting (%)', trans='identity',
      breaks=seq(0,100,10), labels=seq(0,100,10))) +
  
  # theme and overall plot look elements
  theme(
    legend.position = 'bottom', legend.direction = 'vertical',
    panel.grid.major.y = element_line(color='gray85'),
    axis.title = element_text(face='bold')
  ) +
  guides(color=guide_legend(ncol=2)) +
  labs(
    x='Year', y='Stunting (%)', color=NULL
  )

在此处输入图像描述

数据绘图图层:对于线条,请注意使用线型的格式。对于点,使用shape=21为您提供一个带有填充值的开放圆(此处指定)。

辅助 Y 轴:在此处使用sec.axis=相关scale_*_函数中的参数执行添加辅助 y 轴。您调用sec_axis()函数并可以为breaks=labels=和指定各种参数name=。重要的是要注意主轴标题可以通过ylab()labs(y=) 来指定,而辅助轴标题应该通过scale_*_(sec.axis=sec_axis(name=.... 最后,由于辅助轴反映了主轴的镜像... trans=in 的参数sec_axis()只是"identity". 有一个与主轴相同的辅助轴是非常奇怪的,但我不会进一步质疑这里的数据布局。

主题元素:通过查看代码,大部分内容应该是不言自明的。注意在保持方向的同时将图例移动到底部。另外,我曾经guide_legend()指定应该有 2 列,这样您就可以在 2x2 布局中获得 4 个键(注意......也不需要legend.direction=那里,但它没有伤害)。


推荐阅读