R:对应于15年的12个月的数据的时间序列的条形图

时间:2018-12-27 17:15:04

标签: r ggplot2 bar-chart

我有一个数据集,如下所示。

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

我有15列Y(Yi至Yi + 14)。例如,Yi列对应于Yi一年12个月的降水量。我必须在x轴上并排绘制所有年份(及其月份)的降水量。最后,我必须得到这样的东西:
![在此处输入图片描述] [1]

我已经尝试使用meltgroup_by函数按照以下命令重塑数据框:

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)))

但是它不起作用。有什么建议怎么做吗?

2 个答案:

答案 0 :(得分:1)

另一种选择是使用geom_col并按年份进行构面。

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
  )

enter image description here

希望这也很有帮助。

答案 1 :(得分:0)

您可以融化数据框并根据序列1:180绘制值。然后,您可以将自定义标签分配给x轴,以表示年份。

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???")