我對 R 比較陌生,我正在努力尋找一種方法來獲得一組具有不同 y 值的圖。下面是我正在處理的資料集的簡化版本。
| 細胞 | X | y1 | y2 | y3 | y4 |
|---|---|---|---|---|---|
| 一種 | 1 | 0.5 | 0.7 | 0.9 | 1.1 |
| 一種 | 2 | 0.6 | 0.8 | 1.0 | 1.2 |
| 一種 | 3 | 0.7 | 0.9 | 1.1 | 1.3 |
| 乙 | 1 | 0.5 | 2.9 | 4.0 | 3.1 |
| 乙 | 2 | 0.6 | 3.0 | 4.1 | 3.2 |
| 乙 | 3 | 0.7 | 3.1 | 4.2 | 3.3 |
就目前而言,我所擁有的是下面的代碼
ggplot(ETO2, aes(x = x, y = y1)
geom_line()
facet_wrap(~Cell)
有沒有一種簡單的方法來繪制每個方面的不同 y 值?例如,我希望 Cell=A 的資料在 x 上繪制 y1,對于 Cell=B 的資料,我希望它在 x 上繪制 y3。最好我希望將這些圖視為一個輸出。請注意,在我的實際資料集中,有更多的單元格行,并且輕松切換 y 值的列也很好。
非常感謝,我希望我能盡可能清楚地解釋我的意圖。如果沒有,請隨時詢問更多。
uj5u.com熱心網友回復:
通常,“否”,但您可以創建一個新變數,該變數取自y1或y3依賴于Cell. 如果它只是兩個值,那么 ifelse就足夠了,
ETO2$y0 <- ifelse(ETO2$Cell == "A", ETO2$y1, ETO2$y3)
但是,如果還有更多,您可能更喜歡dplyr::case_when或data.table::fcase。
從這里,只需選擇新變數y0:
ggplot(ETO2, aes(x = x, y = y0))
geom_line()
facet_wrap(~Cell)
uj5u.com熱心網友回復:
另一種解決方案是通過在列 Cell 的值上過濾 ET02 來生成兩個圖,然后連接以具有單個輸出。您可以通過這種方式輕松地將各種列切換為 y 軸
library(ggplot2)
library(tidyverse)
library(patchwork) # package for joining ggplot2 plots in different ways
ETO2 %>%
filter(Cell == "A") %>% # select only rows with "A" value in Cell
ggplot(., aes(x = x, y = y1)) # plot over desired y
geom_line() -> p1
ETO2 %>%
filter(Cell == "B") %>% # select only rows with "B" value in Cell
ggplot(., aes(x = x, y = y3)) # plot over desired y
geom_line() -> p2
p1 p2 # side by side
p1 / p2 # top and bottom
如果您希望 y 軸范圍相同但值不同,您可以設定 ylim()
p1 ylim(0,5) -> p1_lim
p2 ylim(0,5) -> p2_lim
p1_lim p2_lim
uj5u.com熱心網友回復:
創建一個字典dict,指定要在哪個單元格中繪制哪個 y 列,將其與 ETO2 合并,創建一個新的 y 變數并繪制。
這種方法非常靈活,因為它不限于 2 個單元。dict 可以有任意數量的行。此外,如果 ETO2 中的任何單元格不與構面相關聯,則只需從 dict 中省略這些單元格。
雖然get(ycol)更短cur_data()[[ycol]]或者c_across(all_of(ycol))也可以在mutate下面作業。
library(dplyr)
library(ggplot2)
dict <- data.frame(Cell = c("A", "B"), ycol = c("y1", "y3"))
ETO2 %>%
inner_join(dict, by = "Cell") %>%
rowwise %>%
mutate(Cell = paste(Cell, ycol, sep = "-"), y = get(ycol)) %>%
ungroup %>%
ggplot(aes(x, y))
geom_line()
facet_wrap(~ Cell)

筆記
ETO2 <- structure(list(Cell = c("A", "A", "A", "B", "B", "B"), x = c(1L,
2L, 3L, 1L, 2L, 3L), y1 = c(0.5, 0.6, 0.7, 0.5, 0.6, 0.7), y2 = c(0.7,
0.8, 0.9, 2.9, 3, 3.1), y3 = c(0.9, 1, 1.1, 4, 4.1, 4.2), y4 = c(1.1,
1.2, 1.3, 3.1, 3.2, 3.3)), class = "data.frame", row.names = c(NA,
-6L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474397.html
