向ggplot图添加独立的y轴

时间:2020-08-11 17:10:15

标签: r ggplot2

我有一个包含4个变量的数据框,其中一个是时间,两个是速度,最后一个是降水。速度和降水之间的尺度完全不同。我想绘制两个Y轴,一个用于速度,一个完全不同的Y轴用于降水。另外,是否可以帮助我手动重新订购图例?

data <- structure(list(Time = structure(c(147L, 25L, 44L, 20L, 7L, 74L, 
51L, 156L, 62L, 115L), .Label = c("06:00:00", "06:05:00", "06:10:00", 
"06:15:00", "06:20:00", "06:25:00", "06:30:00", "06:35:00", "06:40:00", 
"06:45:00", "06:50:00", "06:55:00", "07:00:00", "07:05:00", "07:10:00", 
"07:15:00", "07:20:00", "07:25:00", "07:30:00", "07:35:00", "07:40:00", 
"07:45:00", "07:50:00", "07:55:00", "08:00:00", "08:05:00", "08:10:00", 
"08:15:00", "08:20:00", "08:25:00", "08:30:00", "08:35:00", "08:40:00", 
"08:45:00", "08:50:00", "08:55:00", "09:00:00", "09:05:00", "09:10:00", 
"09:15:00", "09:20:00", "09:25:00", "09:30:00", "09:35:00", "09:40:00", 
"09:45:00", "09:50:00", "09:55:00", "10:00:00", "10:05:00", "10:10:00", 
"10:15:00", "10:20:00", "10:25:00", "10:30:00", "10:35:00", "10:40:00", 
"10:45:00", "10:50:00", "10:55:00", "11:00:00", "11:05:00", "11:10:00", 
"11:15:00", "11:20:00", "11:25:00", "11:30:00", "11:35:00", "11:40:00", 
"11:45:00", "11:50:00", "11:55:00", "12:00:00", "12:05:00", "12:10:00", 
"12:15:00", "12:20:00", "12:25:00", "12:30:00", "12:35:00", "12:40:00", 
"12:45:00", "12:50:00", "12:55:00", "13:00:00", "13:05:00", "13:10:00", 
"13:15:00", "13:20:00", "13:25:00", "13:30:00", "13:35:00", "13:40:00", 
"13:45:00", "13:50:00", "13:55:00", "14:00:00", "14:05:00", "14:10:00", 
"14:15:00", "14:20:00", "14:25:00", "14:30:00", "14:35:00", "14:40:00", 
"14:45:00", "14:50:00", "14:55:00", "15:00:00", "15:05:00", "15:10:00", 
"15:15:00", "15:20:00", "15:25:00", "15:30:00", "15:35:00", "15:40:00", 
"15:45:00", "15:50:00", "15:55:00", "16:00:00", "16:05:00", "16:10:00", 
"16:15:00", "16:20:00", "16:25:00", "16:30:00", "16:35:00", "16:40:00", 
"16:45:00", "16:50:00", "16:55:00", "17:00:00", "17:05:00", "17:10:00", 
"17:15:00", "17:20:00", "17:25:00", "17:30:00", "17:35:00", "17:40:00", 
"17:45:00", "17:50:00", "17:55:00", "18:00:00", "18:05:00", "18:10:00", 
"18:15:00", "18:20:00", "18:25:00", "18:30:00", "18:35:00", "18:40:00", 
"18:45:00", "18:50:00", "18:55:00", "19:00:00"), class = "factor"), 
    variable = structure(c(3L, 1L, 3L, 2L, 1L, 1L, 1L, 3L, 1L, 
    2L), .Label = c("Ground Speed(km/h)", "Precipitation(cm/h)", 
    "Predicted Speed(km/h)"), class = "factor"), value = c(105.507629394531, 
    101.367, 105.266487121582, 3.0613, 99.758, 106.194, 101.367, 
    106.969375610352, 107.803, 0)), row.names = c(NA, -10L), class = "data.frame")

我在下面尝试了此代码:

data %>%
  gather(variable, speed, -Time) %>%
  ggplot(aes(x = Time, y = speed, group = variable,colour = variable, linetype=variable)) + 
  geom_line()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + 
  scale_linetype_manual(values=c("dashed", "dotted", "solid"))+
  scale_x_discrete(breaks=c("07:00:00","10:00:00","13:00:00", "15:00:00", "18:00:00"),
                   labels=c("7:00", "10:00", "13:00", "15:00", "18:00"))+
  xlab("Time")+
  ylab("Speed(km/h)")+
  theme(text=element_text(size=10,  family="Cambria"))+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.border = element_rect(colour = "black", fill=NA, size=1),
        panel.background = element_blank())+
  theme(legend.position = "bottom")+scale_size(range=c(1,9), guide="none")+
  theme(legend.key.size = unit(0.45, "cm"))+
  scale_y_continuous("Precipitation(cm/h)", sec.axis = sec_axis(~., name = "Precipitation"))

2 个答案:

答案 0 :(得分:2)

针对提供的评论,也许您可​​以考虑将facet_wrapscales="free"一起使用。

data %>%
  ggplot(aes(x = Time, y = value, colour = variable)) + 
  geom_line(group = 1)+
  facet_wrap(~variable, scales = "free")+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

reprex package(v0.3.0)于2020-08-11创建

答案 1 :(得分:1)

嗯,您确实需要进行转换,但是您可以做到这一点。我选择* 30作为转换,但这只是一个猜测。我还添加了如何通过重新排列ggplot中的因素来重新排列图例,并消除了一些不必要的东西。

library(dplyr)
library(ggplot2)

data$variable <- 
  forcats::fct_relevel(data$variable, 
    "Ground Speed(km/h)", 
    "Predicted Speed(km/h)", 
    "Precipitation(cm/h)" )

data <- 
  data %>% 
  mutate(newvalue = case_when(
    variable == "Precipitation(cm/h)" ~ value * 30,
    TRUE ~ value)
    )

ggplot(data, aes(x = Time, y = newvalue, group = variable, color = variable, linetype = variable)) +
  geom_line() + 
  scale_y_continuous(sec.axis = sec_axis(~. / 30, name = "Precipation cm/hr")) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + 
  xlab("Time") +
  ylab("Speed(km/h)") +
  theme(text=element_text(size=10))+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.border = element_rect(colour = "black", fill=NA, size=1),
        panel.background = element_blank()) +
  theme(legend.position = "bottom") + 
  theme(legend.key.size = unit(0.45, "cm")) 

相关问题