r - 用百分比变化趋势线绘制 geom_col
问题描述
我怎样才能做到这一点?我在将轴设置为仅显示一个值时遇到了麻烦。这是我到目前为止所尝试的。
# 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))
解决方案
我完全同意这里提出的所有问题,这些问题涉及使用次要 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)
推荐阅读
- r - 如何将列中的所有字符串值粘贴在一起?
- api - 来自 ConfiForms 的 NTLM 身份验证
- c# - 彭博 API 通过 C# 连接到 BBCOM 时调用问题
- ruby - group_by 在红宝石中多次
- css - 量角器:定位包含多个 div 且没有唯一 css 来识别它们的元素
- python-3.x - Jupyter notebook 无法在 Windows 10 中使用 python 3.8 启动
- django - 表单加载后更改字段必填属性
- android - 在firestore中监听多个文档,它的ids存储在一个数组中
- docker - 来自 2 个不同 pod 的 Kubernetes Helm Arquillian 测试
- rest - Restful API 设计:如何在 GET 集合上锁定记录?