首页 > 解决方案 > 用百分比变化趋势线绘制 geom_col

问题描述

我正在尝试在 ggplot 上绘制与此类似的图像在此处输入图像描述

我怎样才能做到这一点?我在将轴设置为仅显示一个值时遇到了麻烦。这是我到目前为止所尝试的。

# A tibble: 5 x 3
  Values  Year  change
   <dbl> <dbl>   <dbl>
1  12307  1999   NA   
2   6267  2000  -96.4 
3   6119  2001   -2.42
4   9254  2002   33.9 
5   3124  2003 -196.   

ggplot(df) +
  geom_col(aes(x= Year, y = Values)) +
  geom_line(aes(x= Year, y = change))

标签: rggplot2

解决方案


我完全同意这里提出的所有问题,这些问题涉及使用次要 y 轴的情节的可解释性。应始终避免使用IMO 辅助轴。

也就是说,ggplot允许您使用辅助 y 轴;所需要做的就是在辅助轴(此处:)上缩放数据并在change内部使用反向变换sec.axis。变换由一个简单的线性模型给出:y_scaled = a0 + a1 * y_original

这是重现情节的尝试:

a1 <- (0 - max(df$Values, na.rm = TRUE) / (diff(-range(df$change, na.rm = TRUE))))
a0 <- max(df$Values, na.rm = TRUE) - a1 * max(df$change, na.rm = TRUE)


library(hrbrthemes)   # For dark ggplot theme
library(tidyverse)    # For ggplot and dplyr
df %>%
    mutate(change_scaled = a0 + a1 * change) %>%
    ggplot(aes(Year, Values)) +
    geom_col(fill = "#00D987", colour = NA) +
    geom_text(
        aes(y = Values, label = Values),
        colour = "#00D987",
        vjust = -1) +
    scale_y_continuous(
        limits = c(0, 1.1 * max(df$Values)),
        sec.axis = sec_axis(~ (. - a0) / a1,name = "Change")) +
    geom_point(
        aes(x = Year, y = change_scaled, group = 1), colour = "#FE9E00") +
    geom_line(
        aes(x = Year, y = change_scaled, group = 1), colour = "#FE9E00") +
    theme_ft_rc() +
    theme(
        axis.title.y = element_text(color = "#00D987"),
        axis.title.y.right = element_text(color = "#FE9E00"))

在此处输入图像描述


样本数据

df <- read.table(text = " Values  Year  change
12307  1999   NA
 6267  2000  -96.4
 6119  2001   -2.42
 9254  2002   33.9
 3124  2003 -196.
", header = T)

推荐阅读