Reputation: 180
I have a dataset which looks like this one below.
month Yi Yi+1
1 0.014310185 13.43838262
2 0.014310185 15.7792948
3 0.176113783 16.14479846
4 3.143663699 16.54060078
5 3.755478277 16.75810501
6 3.767263653 17.03156884
7 3.767263653 17.03156884
8 3.829219647 17.03156884
9 4.375269901 17.78482322
10 8.707536696 18.47995179
11 10.28741362 21.33942187
12 10.66218286 21.82637774
I have 15 columns of Y (Yi to Yi+14). Column Yi, for instance, corresponds to the volume of precipitation over the 12 months of the year Yi. I have to barplot the volume of precipitation of all years (with their months) side by side on the x axis. In the end, I have to get something like this:
![enter image description here][1]
I have already tried the melt
and group_by
functions to reshape my data frame following this commands:
df <- read_excel("df.xls", col_names = FALSE, skip = 1)
colnames(df) <- c("month", "Yi", paste0("Yi+", 1:14)
df.melt <- melt(tab.df, id = c("month", "Yi", paste0("Yi+", 1:14))
bar <- group_by(df.melt, aes(x = 1:length(value), y = value, fill=factor(month))) +
geom_bar(position="dodge", stat="identity"))
ggplot(bar, aes(x=variable, y=mean, fill=factor(month)))
but it did not work. any suggestions how to do that?
Upvotes: 0
Views: 1015
Reputation: 6456
An alternative could be to use geom_col
and facet by year.
library(data.table) # for melt
library(ggplot2)
# Took the data example from @Istrel
set.seed(2018)
df <- data.frame(month = 1:12, matrix(abs(rnorm(12 * 15)), nrow = 12))
colnames(df) <- c("month", "Yi", paste0("Yi+", 1:14))
setDT(df) # just to be sure, convert to data.table; use setDF(df) to switch back
df_m <- data.table::melt(df, "month")
ggplot(data = df_m,
aes(x = month,
y = abs(value),
fill = as.factor(month))) +
geom_col() +
facet_grid(cols = vars(variable),
space = "free_x",
scales = "free_x",
switch = "x") +
# Some graph adjustments:
scale_y_continuous(expand = c(0, 0)) + # remove space between plot area and x axis
labs(x = "Year", y = "Climate variable") +
scale_fill_discrete(name = "Months") + # legend title
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
panel.grid = element_blank(),
panel.spacing = unit(0.1, "cm") # adjust spacing between facets
)
Hope this is also helpful.
Upvotes: 1
Reputation: 2588
You can melt the data frame and plot values against sequence 1:180
. Then you can assign custom labels to x-axis in order to denote years.
library(reshape2)
library(ggplot2)
# Create example df with random values
df <- data.frame(month = 1:12, matrix(rnorm(12 * 15), 12))
colnames(df) <- c("month", "Yi","Yi+1", "Yi+2", "Yi+3", "Yi+4", "Yi+5","Yi+6", "Yi+7", "Yi+8", "Yi+9", "Yi+10","Yi+11","Yi+12","Yi+13","Yi+14")
df_m <- melt(df, "month")
# Prepare labels (at each 6 month for 15 years)
x_labs <- c("Yi","Yi+1", "Yi+2", "Yi+3", "Yi+4", "Yi+5","Yi+6", "Yi+7",
"Yi+8", "Yi+9", "Yi+10","Yi+11","Yi+12","Yi+13","Yi+14")
ggplot(df_m, aes(x = 1:length(value), y = value, fill=factor(month))) +
geom_bar(position="dodge", stat="identity") +
# add custom labels at each 6-th month
scale_x_continuous(labels = x_labs, breaks = seq(6, 15 * 12 - 6, by = 12)) +
xlab("year???")
Upvotes: 0