[英]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 Number
在aes
):
#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.