У меня есть функция, которая добавляет вторую вертикальную ось к графику, чтобы представить вторую переменную с той же горизонтальной осью.
Код следующий:
gplot2eix <- function(data, x, y1, y2, geom, colour= "steelblue", alpha= 1, facDM= NULL){
library(ggplot2)
x <- deparse(substitute(x))
y1 <- deparse(substitute(y1))
y2 <- deparse(substitute(y2))
maxAxiY1 <- max(data[[y1]], na.rm= T)
maxAxiY2 <- max(data[[y2]], na.rm= T)
minAxiY1 <- min(data[[y1]], na.rm= T)
minAxiY2 <- min(data[[y2]], na.rm= T)
offSet <- maxAxiY1-maxAxiY2
#The divisor/scale multiplier for the secondary axis (facDM) can be introduced manually; but if not, the function calculates it automatically
if(is.null(facDM)){
facDM = ((maxAxiY1 - minAxiY1)/(maxAxiY2 - minAxiY2))
}
print(facDM)
vecLim <- c(min(maxAxiY1, maxAxiY2*facDM+offSet, minAxiY1, minAxiY2*facDM+offSet, na.rm = T),
max(maxAxiY1, maxAxiY2*facDM+offSet, minAxiY1, minAxiY2*facDM+offSet, na.rm = T))
#Add the second axis
if(geom=="point"){
graf <- ggplot(data= data, aes(x= data[[x]], y= data[[y1]])) +
geom_point(y=data[[y2]]*facDM + offSet, aes(colour= colour), alpha= alpha) +
scale_y_continuous(sec.axis = sec_axis( ~ (. - offSet)/facDM, name = y2), limits = vecLim)
return(graf)
}
if(geom=="line"){
graf <- ggplot(data= data, aes(x= data[[x]], y= data[[y1]])) +
geom_line(y=data[[y2]]*facDM + offSet, aes(colour= colour), alpha= alpha) +
scale_y_continuous(sec.axis = sec_axis( ~ (. - offSet)/facDM, name = y2), limits = vecLim)
return(graf)
}
if(geom=="pointLine"){
graf <- ggplot(data= data, aes(x= data[[x]], y= data[[y1]])) +
geom_line(aes(y=data[[y2]]*facDM + offSet, colour= colour), alpha= alpha) +
geom_point(aes(y=data[[y2]]*facDM + offSet, colour= colour), alpha= alpha) +
scale_y_continuous(sec.axis = sec_axis( ~ (. - offSet)/facDM, name = y2), limits = vecLim)
return(graf)
}
else{
stop("geom not valid")
}
}
ЭтоФункция определяет только геометрию вторичной оси, поэтому необходимо добавить геометрию главной оси.Ниже приведен пример того, как его использовать:
valorsx <- c(20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)
valorsY1 <- seq(from=900, to=1000, by=1)
valorsY2 <- seq(from=0, to=100, by=1)
valorsY1 <- sample(valorsY1, size=11, replace=TRUE)
valorsY2 <- sample(valorsY2, size=11, replace=TRUE)
dades <- data.frame(varx = valorsx, vary1 = valorsY1, vary2 = valorsY2)
gplot2eix(data=dades, x=varx, y1= vary1, y2= vary2, geom= "pointLine", colour= "red", alpha = 0.6) +
geom_line() + geom_point()
С этим кодом я получаю следующий график:
Но я обнаружил проблему: когда я использую geom_bar () в качестве главной оси, эта гистограмма не печатается:
Я пробовал разныеварианты: использование geom_col (), определение максимальной и минимальной вертикальной оси, чтобы заставить минимум быть равным 0, ... но ничего не помогло.
Так что я был бы признателен, если кто-нибудь знает, как решить эту проблему, спасибо в продвинутом.