首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ggplot2同时设置双y轴图的左右极限范围

用ggplot2同时设置双y轴图的左右极限范围
EN

Stack Overflow用户
提问于 2022-08-03 11:18:27
回答 1查看 47关注 0票数 0

给出一个数据df

代码语言:javascript
复制
df <- structure(list(date = c("2022-4-30", "2022-5-5", "2022-5-6", 
"2022-5-9", "2022-5-10", "2022-5-11", "2022-5-12", "2022-5-13", 
"2022-5-16", "2022-5-17", "2022-5-18", "2022-5-19", "2022-5-20"
), value1 = c(6, 6.1, 6.5, 6.9, 7.3, 7.7, 8.1, 8, 7.9, 7.8, 7.7, 
7.6, 7.5), value2 = c(-1L, -2L, 0L, 6L, 7L, 5L, 3L, 10L, 18L, 
16L, 12L, 19L, 20L), value3 = c(2.7, 2.4, 1.7, 0.5, -0.5, 0.2, 
-0.3, -0.2, 0.4, 0.9, 1.3, 1.1, 1)), class = "data.frame", row.names = c(NA, 
-13L))

退出:

代码语言:javascript
复制
        date value1 value2 value3
1  2022-4-30    6.0     -1    2.7
2   2022-5-5    6.1     -2    2.4
3   2022-5-6    6.5      0    1.7
4   2022-5-9    6.9      6    0.5
5  2022-5-10    7.3      7   -0.5
6  2022-5-11    7.7      5    0.2
7  2022-5-12    8.1      3   -0.3
8  2022-5-13    8.0     10   -0.2
9  2022-5-16    7.9     18    0.4
10 2022-5-17    7.8     16    0.9
11 2022-5-18    7.7     12    1.3
12 2022-5-19    7.6     19    1.1
13 2022-5-20    7.5     20    1.0

我使用下面的代码绘制双y轴( value1value3的左侧,value2的右侧):

代码语言:javascript
复制
df_m <- melt(df, id.vars = 'date')
df_m <- df_m %>% 
  mutate(date=as.Date(date))

df_m1 <- df_m %>% 
  filter(variable %in% c("value1", 'value3')) 

df_m2 <- df_m %>% 
  filter(variable %in% c("value2")) %>%
  mutate(value = value * 0.6)


df_m2
coeff = 1/0.6

ggplot() +
  geom_line(data = df_m1[!is.na(df_m1$value), ], aes(x = date, y = value, col = variable), alpha = 1, size = 1) +
  geom_line(data = df_m2[!is.na(df_m2$value), ], aes(x = date, y = value, col = variable), alpha = 1, size = 1) +
  scale_y_continuous(
    name = '',
    # limits=c(-1, 9),
    sec.axis = sec_axis(~.*coeff, name = "")) 

退出:

现在,我想知道是否可以使用limits=c(-1, 9)同时设置左y轴右y轴limits=c(-2, 20)

我尝试使用下面的代码,但右y轴被更改为limits=c(-2, 15),而不是上面的图。类似的双y轴图的替代解决方案也将受到欢迎。

代码语言:javascript
复制
ggplot() +
  geom_line(data = df_m1[!is.na(df_m1$value), ], aes(x = date, y = value, col = variable), alpha = 1, size = 1) +
  geom_line(data = df_m2[!is.na(df_m2$value), ], aes(x = date, y = value, col = variable), alpha = 1, size = 1) +
  scale_y_continuous(
    name = '',
    limits=c(-1, 9),
    sec.axis = sec_axis(~.*coeff, name = ""))

参考资料:

https://r-graph-gallery.com/line-chart-dual-Y-axis-ggplot2.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-03 16:30:31

这是编写ggh4x::help_secondary()的原因之一。从本质上讲,它计算出了获得二次范围以匹配主范围和逆范围所需的转换。将该变换应用于二次数据,并将其逆作为二次轴的trans参数。

在您的示例中,我们可以删除mutate()位,因为这是在sec$proj()中处理的。

(免责声明:我写了ggh4x)

代码语言:javascript
复制
# df <- structure(...) # omitted for brevity

library(ggplot2)
library(dplyr)
library(reshape2)

df_m <- melt(df, id.vars = 'date')
df_m <- df_m %>% 
  mutate(date=as.Date(date))

df_m1 <- df_m %>% 
  filter(variable %in% c("value1", 'value3')) 

df_m2 <- df_m %>% 
  filter(variable %in% c("value2"))

sec <- ggh4x::help_secondary(
  name = "",
  primary = c(-1, 9), secondary = c(-2, 20),
)

ggplot() +
  geom_line(data = df_m1[!is.na(df_m1$value), ], 
            aes(x = date, y = value, col = variable), alpha = 1, size = 1) +
  geom_line(data = df_m2[!is.na(df_m2$value), ], 
            aes(x = date, y = sec$proj(value), col = variable), alpha = 1, size = 1) +
  scale_y_continuous(
    limits = c(-1, 9),
    name = '',
    sec.axis = sec) 

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73220807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档