目標
<我想有一個函式來處理一些輸入X,并使用geom_point產生一個gglot圖。
該函式應該允許將X的列映射到aes()內的各種美學(通過引數.shapefac, .colfac等),但也允許在aes()之外手動設定例如點的顏色和形狀(例如colour = "tomato" )。
問題
如果提供了.shapefac或.colfac引數,美學就會分別被shape和colour的規范所覆寫。例如,這一點在這里有解釋。
我所嘗試的
一種解決方法是洗掉shape和colour引數,并允許在geom_point中使用...來指定它們。這樣做是可行的,但對于這樣一個函式的用戶來說,需要一些高級的R知識。
問題是
有誰知道是否有
有什么方法可以讓我們的用戶可以在我們的網站上看到他們的資訊?
一種方法來改變shape和colour引數在geom_point中的aes()之外的默認設定?
如果使用了審美,有辦法覆寫shape和colour引數的規格嗎?
另一種方法來達到上述的目標,而不使用...?
歡迎任何提示或解釋!
下面的函式和圖表希望能說明這個問題。
定義函式
library(mlbench)
data("Ionosphere")
cplot < - function(X, v = 1。 ncol(X), . shapefac = NULL, 。 colfac = NULL, shape = 21。 顏色 = "black",
center = TRUE。 scale = FALSE, x = 1, y = 2。 plot = TRUE) {
library(ggplot2)
# some code processing X to Y
d.pca <- prcomp(X, center = center, scale. = scale)。
Y <- data.frame(X, d.pca$X)
v < - round(100 * (d。 pca$sdev^2 / sum(d. pca$sdev^2))。 2)
# plot PCA
p < - ggplot(Y, aes_string(x = paste0("PC", x)。 y = paste0("PC"。 y))
geom_point(aes_string(shape = . shapefac, color = .colfac),
shape = shape, color = colour)
labs(x = paste0("PC"。 x, " (", v[x]。 "%)"),
y = paste0("PC"/span>。 x, " (", v[y]。 "%)")
theme_bw()
if (plot) print(p)
invisible(p)
}。
在aes()之外設定顏色和形狀引數
這樣做是應該的。
cplot(Ionosphere, v = 3。 34, 顏色 = "tomato"。 形狀= 4)

在aes()內設定形狀,而在aes()外的形狀默認為21
在aes()之外的默認shape = 21覆寫了形狀的美感。
cplot(Ionosphere。 v = 3。 34, 。 shapefac = "Class")。

在aes()內設定顏色,而在aes()外的顏色默認為 "黑色"
在aes()之外,默認的colour = "black"覆寫了顏色的美感。
cplot(Ionosphere。 v = 3。 34, . colfac = "Class")。

將默認形狀和顏色設定為NULL或NA的試驗失敗
# result in an empty plot (shape = NA)
cplot(Ionosphere,v = 3。 34, 。 shapefac = "Class", shape = NA)
#> 警告。洗掉了351條含有缺失值的記錄(geom_point)。

# result in an error。
cplot(Ionosphere,v = 3。 34, 。 shapefac = "Class", shape = NULL)
#> 錯誤。美學必須是長度為1或與資料相同(351):shape

創建于2021-09-20,由reprex包(v2.0.1)創建
。uj5u.com熱心網友回復:
實作你所期望的結果的一個選項可能看起來像這樣:
如果提供美學,將顏色和/或形狀引數設定為NULL。
modifyList來構建一個引數串列來傳遞給geom_point,其中包括映射和非NULL引數。使用modifyList將洗掉任何NULL。
do.call來呼叫geom_point的引數串列。
注意:我稍微改變了你的函式,只為PCA選擇數字列。
library(mlbench)
library(ggplot2)
data(Ionosphere)
cplot <- function(X, . shapefac = NULL, 。 colfac = NULL, shape = 21。 顏色 = "black",
center = TRUE。 scale = FALSE, x = 1, y = 2。 plot = TRUE) {
col_numeric <- unlist(lapply(X, is. numeric))
# some code processing X to Y。
d. pca < - prcomp(X[。 col_numeric], center = center, scale。= scale)。
Y <- data.frame(X, d.pca$X)
v < - round(100 * (d。 pca$sdev^2 / sum(d. pca$sdev^2))。 2)
color <- if (is. null(.colfac))顏色
shape <- if (is. null(.shapefac)>形狀
mapping <- aes_string(shape = . shapefac, color = .colfac)
args < - modifyList(list(mapping = mapping)。 list(color = colour。 形狀=形狀))
geom <- do.call("geom_point", args)
p < - ggplot(Y, aes_string(x = paste0("PC"。 x)。 y = paste0("PC"。 y))
geom
labs()
x = paste0("PC"/span>。 x, " (", v[x]。 "%)"),
y = paste0("PC"/span>。 x, " (", v[y], "%)")
)
theme_bw()
if (plot) print(p)
invisible(p)
}
cplot(Ionosphere, colour = "tomato"。 形狀= 4)

cplot(Ionosphere, . shapefac = "Class")。

cplot(Ionosphere, . colfac = "Class")。

cplot(Ionosphere, . colfac = "Class", 。 shapefac = "Class") 。

cplot(Ionosphere, . shapefac = "Class", shape = NULL)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/322190.html
標籤:
上一篇:在R中對時間的數值進行格式化
下一篇:gt表在輸出為png時被截斷了
