geom_vline() dateRangeInput() - geom-vline

I have set up a line graph in shiny. The x axis has dates covering 2014 to current date.
I have set up various vertical lines using geom_vline() to highlight points in the data.
I'm using dateRangeInput() so the user can choose the start/end date range to look at on the graph.
One of my vertical lines is in Feb 2014. If the user uses the dateRangeInput() to look at dates from say Jan 2016 the vertical line for Feb 2014 is still showing on the graph. This is also causing the x axis to go from 2014 even though the data line goes from Jan 2016 to current date.
Is there a way to stop this vertical line showing on the graph when it's outside of the dataRangeInput()? Maybe there's an argument in geom_vline() to deal with this?
library(shiny)
library(tidyr)
library(dplyr)
library(ggplot2)
d <- seq(as.Date("2014-01-01"),Sys.Date(),by="day")
df <- data.frame(date = d , number = seq(1,length(d),by=1))
lines <- data.frame(x = as.Date(c("2014-02-07","2017-10-31", "2017-08-01")),
y = c(2500,5000,7500),
lbl = c("label 1", "label 2", "label 3"))
#UI
ui <- fluidPage(
#date range select:
dateRangeInput(inputId = "date", label = "choose date range",
start = min(df$date), end = max(df$date),
min = min(df$date), max = max(df$date)),
#graph:
plotOutput("line")
)
#SERVER:
server <- function(input, output) {
data <- reactive({ subset(df, date >= input$date[1] & date <= input$date[2])
})
#graph:
output$line <- renderPlot({
my_graph <- ggplot(data(), aes(date, number )) + geom_line() +
geom_vline(data = lines, aes(xintercept = x, color = factor(x) )) +
geom_label(data = lines, aes(x = x, y = y,
label = lbl, colour = factor(x),
fontface = "bold" )) +
scale_color_manual(values=c("#CC0000", "#6699FF", "#99FF66")) +
guides(colour = "none", size = "none")
return(my_graph)
})
}
shinyApp(ui = ui, server = server)

As mentioned by Aimée in a different thread:
In a nutshell, ggplot2 will always plot all of the data that you provide and the axis limits are based on that unless you specify otherwise. So because you are telling it to plot the line & label, they will appear on the plot even though the rest of the data doesn't extend that far.
You can resolve this by telling ggplot2 what you want the limits of your x axis to be, using the coord_cartesian function.
# Set the upper and lower limit for the x axis
dateRange <- c(input$date[1], input$date[2])
my_graph <- ggplot(df, aes(date, number)) + geom_line() +
geom_vline(data = lines, aes(xintercept = x, color = factor(x) )) +
geom_label(data = lines, aes(x = x, y = y,
label = lbl, colour = factor(x),
fontface = "bold" )) +
scale_color_manual(values=c("#CC0000", "#6699FF", "#99FF66")) +
guides(colour = "none", size = "none") +
coord_cartesian(xlim = dateRange)

Related

Automatically assigning p-value position in ggplot loop

I am running an mapply loop on a huge set of data to graph 13 parameters for 19 groups. This is working great except the p-value position. Due to the data varying for each plot I cannot assign position using label.y = 125 for example, in some plots it is in the middle of the bar/error bar. However, I can't assign it higher without having it way to high on other graphs. Is there a way to adjust to the data and error bars?
This is my graphing function and like I said the graph is great, except p-value position. Specifically, the stat compare means anova line.
ANOVA_plotter <- function(Variable, treatment, Grouping, df){
Inputdf <- df %>%
filter(Media == treatment, Group == Grouping) %>%
ggplot(aes_(x = ~ID, y = as.name(Variable))) +
geom_bar(aes(fill = ANOVA_Status), stat = "summary", fun = "mean", width = 0.9) +
stat_summary(geom = "errorbar", fun.data = "mean_sdl", fun.args = list(mult = 1), size = 1) +
labs(title = paste(Variable, "in", treatment, "in Group", Grouping, sep = " ")) +
theme(legend.position = "none",axis.title.x=element_blank(), axis.text = element_text(face="bold", size = 18 ), axis.text.x = element_text(angle = 45, hjust = 1)) +
stat_summary(geom = "errorbar", fun.data = "mean_sdl", fun.args = list(mult = 1), width = 0.2) +
stat_compare_means(method = "anova", label.y = 125) +
stat_compare_means(label = "p.signif", method = "t.test", paired = FALSE, ref.group = "Control")
}
I get graphs that look like this
(https://i.stack.imgur.com/hV9Ad.jpg)
But I can't assign it to label.y = 200 because of plots like this
(https://i.stack.imgur.com/uStez.jpg)

Creating graph on ggplot2 with facte_wrap using multiple seperate variables

For my thesis I am using R-studio. I want to make a graph on ggplot2 with x= age(H2_lft) and y = IMT value (Mean_IMT_alg). I want to plot a graph with multiple variables(cardiovascular risk factors) to see the relationship between a certain variable/cardiovascular risk factor (e.g. smoking(H2_roken)/gender(H1_geslacht)/ethnicity(H1_EtnTotaal) and the IMT value on a certain age.
First, I plotted multiple lines (each line represented a variable) in a graph. But I think this is a little too messy. I actually want to have multiple 'pannels/graphs' with x= age and y = IMT value. And in every graph I want to have a different variable.
I hope my explanation is clear enough and someone can help me :)
My first code (multiple lines in same plot) is:
t <- ggplot(data = Dataset, aes(x = H2_lft, y = MeanIMT_alg)) +
geom_smooth(se = FALSE, aes(group = H1_EtnTotaal, colour = H1_EtnTotaal)) +
geom_smooth(se = FALSE, aes(group = H2_Roken, colour = H2_Roken)) +
geom_smooth(se = FALSE, aes(group = H1_geslacht, colour = H1_geslacht)) +
stat_smooth(method = lm, se=FALSE) +
theme_classic()
t + labs(x = "Age (years)", y = "Mean IMT (mm)", title ="IMT", caption = "Figure 2: mean IMT", color = "cardiovascular risk factors", fil = "cardiovascular risk factors")
To accomplish multiple panels i used 'facet_wrap'. The problem however is that when using 'groups' in facet_Wrap, R makes groups that proceed on each other. But i want the groups to be unrelated of eachother. For example: I want one graph with a line for Marroccan ethnicity, one line with current smoking and one line with Male participants. I do not want a graph with: morroccan women that currently smoke or: Dutch men that never smoked. So, I want the graph with all the lines but split into several graphs.
The code that I used to accomplish this is:
t <- ggplot(data = Dataset, aes(x = H2_lft, y = MeanIMT_alg)) +
geom_smooth(se = FALSE, aes(group = H1_EtnTotaal, colour = H1_EtnTotaal)) +
geom_smooth(se = FALSE, aes(group = H2_Roken, colour = H2_Roken)) +
geom_smooth(se = FALSE, aes(group = H1_geslacht, colour = H1_geslacht)) +
stat_smooth(method = lm, se=FALSE)+
facet_wrap(~H1_EtnTotaal + ~H2_Roken + ~H1_geslacht, scales = "free_y") +
theme_classic()
t + labs(x = "Age (years)", y = "Mean IMT (mm)", title ="IMT", caption = "Figure 2: mean IMT", color = "cardiovascular risk factors", fil = "cardiovascular risk factors")
I think it might be generally easier to reshape the data to a long format for plotting with ggplot2. If you want seperate legends for each of the categories, you can use the {ggnewscale} package to do so. Is this (approximately) what you're looking for?
library(ggnewscale)
library(ggplot2)
# Dummy data
Dataset <- data.frame(
H2_lft = runif(100, 18, 90),
MeanIMT_alg = rnorm(100),
H1_EtnTotaal = sample(LETTERS[1:5], 100, replace = TRUE),
H2_Roken = sample(LETTERS[6:8], 100, replace = TRUE),
H1_geslacht = sample(c("M", "F"), 100, replace = TRUE)
)
# Reshape data to long format
new <- tidyr::pivot_longer(Dataset, c(H1_EtnTotaal, H2_Roken, H1_geslacht))
ggplot(new, aes(H2_lft, MeanIMT_alg, group = value)) +
geom_smooth(
data = ~ subset(.x, name == "H1_EtnTotaal"),
aes(colour = value),
se = FALSE
) +
scale_colour_discrete(name = "EtnTotaal") +
new_scale_colour() +
geom_smooth(
data = ~ subset(.x, name == "H1_geslacht"),
aes(colour = value),
se = FALSE
) +
scale_colour_discrete(name = "geslacht") +
new_scale_colour() +
geom_smooth(
data = ~ subset(.x, name == "H2_Roken"),
aes(colour = value),
se = FALSE
) +
scale_colour_discrete(name = "Roken") +
geom_smooth(
method = lm, se = FALSE,
aes(group = NULL)
) +
facet_wrap(~ name)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
#> `geom_smooth()` using formula 'y ~ x'
Created on 2022-11-04 by the reprex package (v2.0.0)

How to label line plot in a combined bar & line plot in ggplot r?

I want to combine a bar and line plot and label line plot.
This is what I got: plot
this is my code:
df %>%
ggplot(aes(reorder(NAME, pval),y = pval)) +
geom_col(aes(x = NAME, y = pval), size = 1, color = "royalblue", fill = "white") +
geom_line(aes(x = NAME, y = 10*Ratio), size = 1.5, color="#c4271b", group = 1) + geom_text(aes(label = Ratio))+coord_flip()
I want to label line plot, but the bar plot gets the labels?
My second question:
How to rearrange the y-axis from the largest -log(pvalue) to lowest one?
Any help will be really appreciated!
try set the x and y aes in geom_text() with the same in geom_line()
geom_text(aes(x = NAME, y = 10*Ratio, label = Ratio))

Why is my y value not displayed in the time series (bar plot)?

So I've created a time series event. I'd like to plot my NS data on the y axes. Unfortunately it's not working and I can't figure out why. I'd like to plot it as a bar plot. The x value input should be my newly created DateTime. Any notes?
library(ggplot2)
library(scales)
Versuch3 <- data.frame(date = c("1.1.2015", "2.1.2015", "3.1.2015"),
time = c("06:12:03", "08:23:45", "15:40:32"),
NS = c("0.3", "0.4", "0.6"),
status = c("0", "1", "0"))
Versuch3$DateTime <- paste(Versuch3$date,Versuch3$time,sep =" ")
Versuch3$DateTime <- as.POSIXct(strptime(Versuch3$DateTime, "%d.%m.%Y %H:%M:%S"))
Versuch3$NS <- as.integer(Versuch3$NS)
dtLimits <- c(as.POSIXct("2014-12-01 00:00:00"), as.POSIXct("2015-07-01 00:00:00"))
#plot
ggplot(data = Versuch3, aes(x=DateTime, y=NS)) +
geom_bar(stat="identity", aes(fill=status), width = 3) +
scale_x_datetime(date_breaks = "1 month",
labels = date_format("%d.%m.%Y %H:%M:%S"),
limits = dtLimits) +
theme(axis.text.x = element_text(angle = 90, vjust = .5))

Plotting time series with different length

I have two time series (ts-variables) with different time length. It’s yearly data and they are stored as separate ts.objects. The first series starts in 1936 and the other starts in 1943 and both ends in 2012. Problem: I cannot find the R-script (commands) for plotting these series in one, single, nice figure which includes all observations. Great if someone can help.
Regards
If the data are on a comparable scale then you just need to set the x-axis limits to the range of the entire data, e.g.
set.seed(2) ## reproducible
dat1 <- data.frame(Year = seq(1936, 2012, by = 1), Y = runif(77))
dat2 <- data.frame(Year = seq(1943, 2012, by = 1), Y = runif(70))
ylim <- range(dat1$Y, dat2$Y)
xlim <- range(dat1$Year, dat2$Year)
plot(Y ~ Year, data = dat1, type = "l", col = "red", xlim = xlim,
ylim = ylim)
lines(Y ~ Year, data = dat2, type = "l", col = "blue")
I'll leave you to prettify the plot.
Just noticed you said ts variables, so the following will work too
ts1 <- ts(runif(77), start = 1936, freq = 1)
ts2 <- ts(runif(70), start = 1943, freq = 1)
xlim <- c(1936, 2012)
ylim <- range(ts1, ts2)
plot(ts1, ylim = ylim, xlim = xlim, col = "red")
lines(ts2, col = "blue")
With your data, replace runif(n) with the real data for the two time series.