我有一個簡單形式的資料框 (df),如下所示:
year month place Value
1 2017 11 A 8
2 2017 11 B 14
3 2017 11 C 17
4 2017 12 A 55
5 2017 12 B 12
6 2017 12 C 69
7 2018 11 A 42
8 2018 11 B 25
9 2018 11 C 21
10 2018 12 A 26
11 2018 12 B 81
12 2018 12 C 14
我正在嘗試為每個 A、B 和 C 繪制多個圖表,以觀察該月與上個月相比的變化
library(zoo)
library(ggplot2)
df$time <- as.yearmon(paste(df$Year,df$month), "%Y %m")
ggplot(df, aes(x=as.character(time), y= Value, color= as.factor(place)))
geom_point() geom_line(aes(group=1)) facet_grid(place~., scales = "free_y")
但這不起作用。即使 x 軸在資料框中排序,它也會被打亂,因為 x 軸被標記為 2017 年 11 月,然后是 2018 年 11 月,而不是 2017 年 11 月,然后是 2017 年 12 月。我在這里做錯了什么?
uj5u.com熱心網友回復:
更新見OP的評論:
library(ggplot2)
df %>%
mutate(time = as.Date(paste(year, month,"01", sep = "-"))) %>%
ggplot(aes(x=time, y= Value, color= as.factor(place)))
geom_point()
geom_line(aes(group=place))
scale_x_date(date_labels="%b %y",date_breaks ="1 month")
facet_grid(place~., scales= "free_y")
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

第一個答案:
與facet_grid
library(ggplot2)
df %>%
mutate(time = paste(month, year, sep = "-")) %>%
ggplot(aes(x=time, y= Value, color= as.factor(place)))
geom_point()
geom_line(aes(group=place))
facet_grid(place~., scales= "free_y")

沒有facet_grid作為State is not in the provided資料框。
- 您不需要先申請
yearmon,然后再將班級改回角色
library(ggplot2)
library(dplyr)
df %>%
mutate(time = paste(month, year, sep = "-")) %>%
ggplot(aes(x=time, y= Value, color= as.factor(place)))
geom_point()
geom_line(aes(group=place))

資料:
structure(list(year = c(2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L), month = c(11L, 11L,
11L, 12L, 12L, 12L, 11L, 11L, 11L, 12L, 12L, 12L), place = c("A",
"B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"), Value = c(8L,
14L, 17L, 55L, 12L, 69L, 42L, 25L, 21L, 26L, 81L, 14L), time = structure(c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), class = "yearmon")), row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")
uj5u.com熱心網友回復:
這對我有用-
library(zoo)
library(ggplot2)
df$time <- as.yearmon(paste(df$year,df$month), "%Y %m")
ggplot(df, aes(x=time, y= Value, color= as.factor(place)))
geom_point()
geom_line(aes(group=1))
facet_grid(place~., scales = "free_y")

資料
df <- structure(list(year = c(2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L), month = c(11L, 11L,
11L, 12L, 12L, 12L, 11L, 11L, 11L, 12L, 12L, 12L), place = c("A",
"B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"), Value = c(8L,
14L, 17L, 55L, 12L, 69L, 42L, 25L, 21L, 26L, 81L, 14L)),
class = "data.frame", row.names = c(NA, -12L))
uj5u.com熱心網友回復:
題中的代碼有幾個問題:
- yearmon 列被轉換為字符,所以它不再是連續的
- df 包含年份但代碼使用年份
解決這些問題就足夠了,但建議改用自動繪圖。使用末尾注釋中可重復顯示的輸入將 df 轉換為動物園物件 z,然后它是一個使用 scale_x_yearmon 的簡單單行自動繪圖命令。
確保 df 是顯示在問題頂部和末尾注釋中的那個,并且不包括在問題代碼中添加的時間列。
在 read.zoo 中,index 引數指示時間索引位于哪些列(年和月) split 引數指示如何將結果拆分為列(每個位置一列)并且 FUN 引數提供了一個函式來轉換兩個索引列到 yearmon 索引。然后如上所述,將 autoplot.zoo 與 scale_x_yearmon 一起使用。
一些可選專案是,如果需要顯示所有繪圖的單個面板,則將引數 facets=NULL 添加到自動繪圖呼叫中。如果您想要自由變化的比例,也可以添加 facet_free() 雖然如果每個人都使用相同的比例會更容易進行比較,如下所示。
library(ggplot2)
library(zoo)
to_ym <- function(y, m) as.yearmon(paste(y, m, sep = "-"))
z <- read.zoo(df, index = c("year", "month"), split = "place", FUN = to_ym)
autoplot(z, col = Series) scale_x_yearmon(n = 20)

筆記
可重現形式的輸入:
Lines <- "year month place Value
1 2017 11 A 8
2 2017 11 B 14
3 2017 11 C 17
4 2017 12 A 55
5 2017 12 B 12
6 2017 12 C 69
7 2018 11 A 42
8 2018 11 B 25
9 2018 11 C 21
10 2018 12 A 26
11 2018 12 B 81
12 2018 12 C 14"
df <- read.table(text = Lines)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/373015.html
上一篇:如何將正交多項式分配給函式?
