簡體   English   中英

ggplot中es函數中反引號和引號之間的區別

[英]Difference between backticks and quotes in aes function in ggplot

好吧,這有點奇怪。 我正在回答有關geom_histogram的初學者的問題,並且OP發布了一個使用反引號的示例。 他忽略了添加數據,因此我進行了整理,然后找到了答案,甚至沒有注意到倒敘。 但是發布的另一個答案(實際上更優雅)沒有反引號。 它並沒有真正起作用,但是與反引號一起使用時效果要好得多。

但是現在我很困惑。 我完全不知道為什么應該有所不同。 就連ggplot列表幾乎相同,據我ggplot$mapping ,只有ggplot$mapping元素有所不同(好吧,這是一個大問題)。 我已經在Google上搜索了一下,但是看不到發生了什么。

所以這是代碼:

(在aes Log Number附近引用):

#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")

# Plot it
gpsq <- ggplot(d, aes(x = 'Log Number', fill = state)) + geom_histogram()
print(gpsq)

產生這個

在此處輸入圖片說明

這種 (反引號周圍的Log Numberaes ):

#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")

# Plot it
gpsq <- ggplot(d, aes(x = `Log Number`, fill = state)) + geom_histogram()
print(gpsq)

更正確地產生此:

在此處輸入圖片說明

反斜杠是在R中表示非標准變量名稱的標准方法。引號用於指示字符串。 例:

`bad name` = 1
`bad name`
# [1] 1

這不適用於引號。

"bad name" = 1
"bad name"
# [1] "bad name"

通常,您不應該使用這些奇怪的非標准名稱。 但是,如果需要的話,這就是這樣做的方式。 你幾乎可以做任何事情,

`really-bad^name+violating*all()/[kinds] <- of == rules&!|` = 1
# works just fine

但這並不意味着你應該


關於ggplot ,如果您做了

ggplot(mtcars, aes(x = wt, y = 1)) + geom_point()

您會期望所有y值都為1。這是對的!

用引號引起來的字符串是一樣的:

ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point()

除了代替上面的y = 1情況下的數字外,您給了它一個字符-對於離散的y比例(僅一個值),該字符被隱式轉換為一個因數(僅一個級別)。 是否存在名為"mpg"的列都沒有關系,因為您剛剛向aes()傳遞了一個值。 ggplot不會在第一個示例中查找名為mpg的列,就不會在mpg中查找名為1的列。

隨着反勾,你給ggplot東西[R識別為一個對象名稱 ,而不是就像一個值1"some string" 因此, ggplot 確實會尋找具有該名稱的列。

# both of these work
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point()

雖然反滴答標記確實有效 ,並且通常在aes()設置常量也有效,但不建議二者都使用。 設置常量的首選方法是aes()外部設置常量 這是確保所有內容在更復雜的圖中都能正常工作的唯一方法。 特別是,如果您嘗試在aes()內做一些奇怪的事情(尤其是轉換),則方面通常會出錯或無法產生預期的結果。

# better than above, set a constant outside of `aes()`
# Here I set y as a constant which is a bit unusual
ggplot(mtcars, aes(x = wt)) + geom_point(y = 1)
# aesthetics that are more commonly set to constants are
# size, color, fill, etc.

對於非標准的列名, aes_string()可以很好地工作,然后期望將美學映射引用為列名。 如果正在編寫創建ggplots且需要將列名作為參數的函數,這也是做事情的好方法。

ggplot(mtcars, aes_string(x = "wt", y = "mpg")) + geom_point()
# or, in a variable
my_y_column = "mpg"
ggplot(mtcars, aes_string(x = "wt", y = my_y_column)) + geom_point()

還有一個很好的例子,感謝@TheTime,它開始變得面目全非:

最終, ggplot需要評估所有內容,這將通過eval完成。 考慮以下:

a <- 1

eval(parse(text="a"))
# [1] 1

eval(parse(text='"a"'))
# [1] "a"

eval(parse(text="`a`"))
# [1] 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM