An error occurred while loading the file. Please try again.
-
Heraut Louis authoredeec947d6
# Usefull library
library(ggplot2)
library(scales)
library(qpdf)
library(gridExtra)
library(gridtext)
library(dplyr)
library(grid)
library(ggh4x)
library(RColorBrewer)
time_panel = function (df_data_code, df_trend_code, type, p_threshold=0.1, missRect=FALSE, unit2day=365.25, period=NULL, last=FALSE, color=NULL) {
if (type == 'sqrt(Q)') {
df_data_code$Qm3s = sqrt(df_data_code$Qm3s)
}
maxQ = max(df_data_code$Qm3s, na.rm=TRUE)
power = get_power(maxQ)
dbrk = 10^power
df_data_code$Qm3sN = df_data_code$Qm3s / dbrk
if (!is.null(df_trend_code)) {
df_trend_code$trendN = df_trend_code$trend / dbrk
df_trend_code$interceptN = df_trend_code$intercept / dbrk
}
maxQN = max(df_data_code$Qm3sN, na.rm=TRUE)
if (maxQN >= 5) {
dbrk = 1.0
accuracy = 0.1
} else if (maxQN < 5 & maxQN >= 3) {
dbrk = 0.5
accuracy = 0.1
} else if (maxQN < 3 & maxQN >= 2) {
dbrk = 0.4
accuracy = 0.1
} else if (maxQN < 2 & maxQN >= 1) {
dbrk = 0.2
accuracy = 0.1
} else if (maxQN < 1) {
dbrk = 0.1
accuracy = 0.1
}
dDate = as.numeric(df_data_code$Date[length(df_data_code$Date)] -
df_data_code$Date[1]) / unit2day
# datebreak = round(as.numeric(dDate) / unit2day / 11 , 0)
if (dDate >= 100) {
datebreak = 25
dateminbreak = 5
} else if (dDate < 100 & dDate >= 50) {
datebreak = 10
dateminbreak = 1
} else if (dDate < 50) {
datebreak = 5
dateminbreak = 1
}
p = ggplot() +
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
# theme_bw() +
theme(panel.background=element_rect(fill='white'),
text=element_text(family='sans'),
panel.border=element_blank(),
panel.grid.major.y=element_line(color='grey85', size=0.3),
panel.grid.major.x=element_blank(),
axis.ticks.y=element_blank(),
axis.ticks.x=element_line(color='grey75', size=0.3),
axis.text.x=element_text(color='grey40'),
axis.text.y=element_text(color='grey40'),
ggh4x.axis.ticks.length.minor=rel(0.5),
axis.ticks.length=unit(1.5, 'mm'),
plot.title=element_text(size=9, vjust=-3,
hjust=-1E-3, color='grey20'),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
# axis.title.y=element_text(size=8, color='grey20'),
axis.line.x=element_blank(),
axis.line.y=element_blank(),
)
if (last) {
p = p +
theme(plot.margin=margin(1, 5, 5, 5, unit="mm"))
} else {
p = p +
theme(plot.margin=margin(1, 5, 1, 5, unit="mm"))
}
if (type == 'sqrt(Q)' | type == 'Q') {
p = p +
geom_line(aes(x=df_data_code$Date, y=df_data_code$Qm3sN),
color='grey20',
size=0.3)
} else {
p = p +
# geom_line(aes(x=df_data_code$Date, y=df_data_code$Qm3sN),
# color='grey70') +
geom_point(aes(x=df_data_code$Date, y=df_data_code$Qm3sN),
shape=1, color='grey20', size=1)
}
if (missRect) {
NAdate = df_data_code$Date[is.na(df_data_code$Qm3sN)]
dNAdate = diff(NAdate)
NAdate_Down = NAdate[append(Inf, dNAdate) != 1]
NAdate_Up = NAdate[append(dNAdate, Inf) != 1]
p = p +
geom_rect(aes(xmin=NAdate_Down,
ymin=0,
xmax=NAdate_Up,
ymax=maxQN*1.1),
linetype=0, fill='Wheat', alpha=0.4)
}
if ((type == 'sqrt(Q)' | type == 'Q') & !is.null(period)) {
period = as.Date(period)
p = p +
geom_rect(aes(xmin=min(df_data_code$Date),
ymin=0,
xmax=period[1],
ymax= maxQN*1.1),
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
linetype=0, fill='grey85', alpha=0.3) +
geom_rect(aes(xmin=period[2],
ymin=0,
xmax=max(df_data_code$Date),
ymax= maxQN*1.1),
linetype=0, fill='grey85', alpha=0.3)
}
if (!is.null(df_trend_code)) {
if (df_trend_code$p <= p_threshold) {
abs = c(df_data_code$Date[1],
df_data_code$Date[length(df_data_code$Date)])
abs_num = as.numeric(abs) / unit2day
ord = abs_num * df_trend_code$trendN +
df_trend_code$interceptN
if (!is.null(color)) {
p = p +
geom_line(aes(x=abs, y=ord),
color=color,
size=0.7)
} else {
p = p +
geom_line(aes(x=abs, y=ord),
color='cornflowerblue')
}
p = p +
ggtitle(bquote(.(type)~~'['*m^{3}*'.'*s^{-1}*'] x'~10^{.(as.character(power))}~~~'tendance :'~.(format(df_trend_code$trend, scientific=TRUE, digits=3))~m^{3}*'.'*s^{-1}*'.'*an^{-1}))
} else {
p = p +
ggtitle(bquote(.(type)~' ['*m^{3}*'.'*s^{-1}*'] x'~10^{.(as.character(power))}))
}
} else {
p = p +
ggtitle(bquote(.(type)~' ['*m^{3}*'.'*s^{-1}*'] x'~10^{.(as.character(power))}))
}
# if (norm) {
# p = p +
# ylab(bquote('dbit ['*m^{3}*'.'*s^{-1}*'] x'~10^{.(as.character(power))}))
# } else {
# p = p +
# ylab(expression(paste('dbit [', m^{3}, '.',
# s^{-1}, ']', sep='')))
# }
p = p +
# xlab('date') +
scale_x_date(date_breaks=paste(as.character(datebreak),
'year', sep=' '),
date_minor_breaks=paste(as.character(dateminbreak),
'year', sep=' '),
guide='axis_minor',
date_labels="%Y",
limits=c(min(df_data_code$Date),
max(df_data_code$Date)),
expand=c(0, 0)) +
scale_y_continuous(breaks=seq(0, maxQN*10, dbrk),
limits=c(0, maxQN*1.1),
expand=c(0, 0),
labels=label_number(accuracy=accuracy))
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
return(p)
}
text_panel = function(code, df_meta) {
df_meta_code = df_meta[df_meta$code == code,]
text = paste(
"<span style='font-size:18pt'> station <b>", code, "</b></span><br>",
"nom : ", df_meta_code$nom, "<br>",
"rgion hydrographique : ", df_meta_code$region_hydro, "<br>",
"position : (", df_meta_code$L93X, "; ", df_meta_code$L93Y, ")", "<br>",
"surface : ", df_meta_code$surface_km2, " km<sup>2</sup>",
sep='')
gtext = richtext_grob(text,
x=0, y=1,
margin=unit(c(5, 5, 5, 5), "mm"),
hjust=0, vjust=1,
gp=gpar(col="grey20", fontsize=12))
return(gtext)
}
matrice_panel = function (list_df2plot, df_meta) {
nbp = length(list_df2plot)
minTrend = c()
maxTrend = c()
for (i in 1:nbp) {
df_trend = list_df2plot[[i]]$trend
p_threshold = list_df2plot[[i]]$p_threshold
okTrend = df_trend$trend[df_trend$p <= p_threshold]
minTrend[i] = min(okTrend, na.rm=TRUE)
maxTrend[i] = max(okTrend, na.rm=TRUE)
}
# Get all different stations code
Code = levels(factor(df_meta$code))
# Type = vector(mode='list', length=nbp)
# for (i in 1:nbp) {
# Type[[i]] =
# }
Type_mat = list()
Code_mat = c()
Trend_mat = c()
Fill_mat = c()
Color_mat = c()
for (code in Code) {
for (i in 1:nbp) {
df_trend = list_df2plot[[i]]$trend
p_threshold = list_df2plot[[i]]$p_threshold
type = list_df2plot[[i]]$type
Type_mat = append(Type_mat, type)
Code_mat = append(Code_mat, code)
df_trend_code = df_trend[df_trend$code == code,]
if (df_trend_code$p <= p_threshold){
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
color_res = get_color(df_trend_code$trend,
minTrend[i],
maxTrend[i],
palette_name='perso',
reverse=FALSE)
trend = df_trend_code$trend
fill = color_res$color
color = 'white'
} else {
trend = NA
fill = 'white'
color = 'white'
}
Trend_mat = append(Trend_mat, trend)
Fill_mat = append(Fill_mat, fill)
Color_mat = append(Color_mat, color)
}
}
X = as.integer(factor(as.character(Type_mat)))
Y = as.integer(factor(Code_mat))
mat = ggplot() +
theme(
panel.background=element_rect(fill='white'),
text=element_text(family='sans'),
panel.border=element_blank(),
panel.grid.major.y=element_blank(),
panel.grid.major.x=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.ticks.x=element_blank(),
ggh4x.axis.ticks.length.minor=rel(0.5),
axis.ticks.length=unit(1.5, 'mm'),
plot.title=element_text(size=9, vjust=-3,
hjust=-1E-3, color='grey20'),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
axis.line.x=element_blank(),
axis.line.y=element_blank(),
plot.margin=margin(5, 5, 5, 5, unit="mm"),
)
# geom_point(aes(x=X, y=Y),
# shape=21, fill=Fill_mat, color=Color_mat,
# size=15, stroke=1) +
for (i in 1:length(X)) {
mat = mat +
gg_circle(r=0.5, xc=X[i], yc=Y[i], fill=Fill_mat[i], color=Color_mat[i])
}
mat = mat +
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
coord_fixed() +
scale_x_continuous(limits=c(min(c(X, Y)) - rel(1.5),
max(c(X, Y)) + rel(0.5)),
expand=c(0, 0)) +
scale_y_continuous(limits=c(min(c(X, Y)) - rel(0.5),
max(c(X, Y)) + rel(1)),
expand=c(0, 0))
# scale_x_continuous(limits=c(min(X)-0.4, max(X)+0.2),
# expand=c(0, 0)) +
# scale_y_continuous(limits=c(min(Y)-0.2, max(Y)+0.4),
# expand=c(0, 0))
for (i in 1:length(Code)) {
mat = mat +
annotate('text', x=-0.5, y=i,
label=Code[i],
hjust=0, vjust=0.5,
size=3.5, color='grey40')
}
for (i in 1:nbp) {
type = list_df2plot[[i]]$type
mat = mat +
annotate('text', x=i, y=max(Y) + 0.6,
label=bquote(.(type)),
hjust=0.5, vjust=0,
size=3.5, color='grey40')
}
for (i in 1:length(Trend_mat)) {
trend = Trend_mat[i]
if (!is.na(trend)) {
power = get_power(trend)
dbrk = 10^power
trendN = round(trend / dbrk, 2)
trendC1 = as.character(trendN)
trendC2 = bquote('x '*10^{.(as.character(power))})
} else {
trendC1 = ''
trendC2 = ''
}
mat = mat +
annotate('text', x=X[i], y=Y[i],
label=trendC1,
hjust=0.5, vjust=0,
size=3, color='white') +
annotate('text', x=X[i], y=Y[i],
label=trendC2,
hjust=0.5, vjust=1.3,
size=2, color='white')
}
return (mat)
}
get_color = function (value, min, max, ncolor=256, palette_name='perso', reverse=FALSE) {
if (palette_name == 'perso') {
palette = colorRampPalette(c(
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
'#1a4157',
'#00af9d',
'#fbdd7e',
'#fdb147',
'#fd4659'
))(ncolor)
} else {
palette = colorRampPalette(brewer.pal(11, palette_name))(ncolor)
}
if (reverse) {
palette = rev(palette)
}
palette_cold = palette[1:as.integer(ncolor/2)]
palette_hot = palette[(as.integer(ncolor/2)+1):ncolor]
ncolor_cold = length(palette_cold)
ncolor_hot = length(palette_hot)
if (value < 0) {
idNorm = (value - min) / (0 - min)
id = round(idNorm*(ncolor_cold - 1) + 1, 0)
color = palette_cold[id]
} else {
idNorm = (value - 0) / (max - 0)
id = round(idNorm*(ncolor_hot - 1) + 1, 0)
color = palette_hot[id]
}
return(list(color=color, palette=palette))
}
void = ggplot() + geom_blank(aes(1,1)) +
theme(
plot.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.line = element_blank()
)
palette_tester = function () {
n = 300
X = 1:n
Y = rep(0, times=n)
palette = colorRampPalette(c(
'#1a4157',
'#00af9d',
'#fbdd7e',
'#fdb147',
'#fd4659'
))(n)
p = ggplot() +
geom_line(aes(x=X, y=Y), color=palette[X], size=10) +
scale_y_continuous(expand=c(0, 0))
ggsave(plot=p,
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
path='/figures',
filename=paste('palette_test', '.pdf', sep=''),
width=10, height=10, units='cm', dpi=100)
}
# palette_teste()
get_power = function (value) {
if (value > 1) {
power = nchar(as.character(as.integer(value))) - 1
} else {
dec = gsub('0.', '', as.character(value), fixed=TRUE)
ndec = nchar(dec)
nnum = nchar(as.character(as.numeric(dec)))
power = -(ndec - nnum + 1)
}
return(power)
}
gg_circle = function(r, xc, yc, color="black", fill=NA, ...) {
x = xc + r*cos(seq(0, pi, length.out=100))
ymax = yc + r*sin(seq(0, pi, length.out=100))
ymin = yc + r*sin(seq(0, -pi, length.out=100))
annotate("ribbon", x=x, ymin=ymin, ymax=ymax, color=color, fill=fill, ...)
}