R_Language 板


LINE

[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 使用者(已經有用R 做過不少作品) [問題敘述]: 在ggplot2、plotly、leaflet等繪圖套件中, 很常直接用變數的名稱去做aesthetic mapping, 但是一旦碰到迴圈或其它programming需求, 它反而很難一般化。 像是下列的ggplot2繪圖範例就有些結果上的差別。 我知道ggplot2套件中有aes_string提供較好的解決方案, 但是其它繪圖套件(例如plotly或leaflet)有類似的function嗎? 還是它們用non-standard evaluation時不會有問題? 這個問題困擾我滿久了,有沒有人願意分享一下經驗? 謝謝! [程式範例]: # 最一般的做法 ggplot(mtcars, aes(mpg, qsec)) + geom_point() + facet_grid(. ~ am) # 利用aes_string function ggplot(mtcars, aes_string("mpg", "qsec")) + geom_point() + facet_grid(. ~ am) # 以下結果是錯誤的圖 # 用[]指定column ggplot(mtcars, aes(mtcars[,1], mtcars[,7])) + geom_point() + facet_grid(. ~ am) # Non-standard evaluation ggplot(mtcars, aes(eval(parse(text = "mpg"), envir = mtcars), eval(parse(text = "qsec"), envir = mtcars))) + geom_point() + facet_grid(. ~ am) Stack Overflow相關解答:https://goo.gl/onbTcz [關鍵字]: Non-standard evaluation, aesthetic mapping --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.121.113
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1503486206.A.9C3.html ※ 編輯: clsmbstu (140.112.121.113), 08/23/2017 19:08:12
1F:→ celestialgod: aes_string 不方便的話,可以考慮wrapr.... 08/23 19:22
2F:→ celestialgod: 如果你還在想要用column slice方式畫圖,乾脆直接用 08/23 19:23
3F:→ celestialgod: 原本R的繪圖..... 08/23 19:23
4F:→ celestialgod: 不知道你說的一般化是什麼,輸入x,y然後繪圖嗎? 08/23 19:24
5F:→ clsmbstu: 一般化很好舉例啊,例如我要一個shiny app,可以讓使用 08/23 19:49
6F:→ clsmbstu: 者從vs和am選任一當facet,再任選兩個column畫散佈圖, 08/23 19:51
7F:→ clsmbstu: aes還有aes_string,但就沒有facet_grid_string 08/23 19:52
8F:→ clsmbstu: 需要迴圈的例子也很常見,例如我要依第一行當facet、第 08/23 19:53
9F:→ clsmbstu: 二行為x、第三行起每個奇數行當y,每個存一張圖,用數列 08/23 19:54
10F:→ clsmbstu: 一下就解決了,偏偏ggplot2就不給這樣玩。 08/23 19:55
11F:→ celestialgod: facet_grid就用paste + as.formula 08/23 19:57
12F:→ celestialgod: 迴圈就用names然後取column 08/23 19:57
13F:→ clsmbstu: 不懂為什麼想要用column slice就得回原本的R繪圖...... 08/23 19:58
14F:→ celestialgod: 我覺得是沒用R的思維去思考ggplot2的設計QQ 08/23 19:58
15F:→ celestialgod: 因為只有原本R繪圖才能 plot(mtcars[,1], mtcars[,2 08/23 19:58
16F:→ celestialgod: lattice或是ggplot2都用data.frame概念去設計 08/23 19:59
17F:→ celestialgod: table型式資料才比較值觀 08/23 19:59
18F:→ celestialgod: 兩個vector要做圖,要考慮長度問題、順序問題 08/23 19:59
19F:→ celestialgod: table就很值觀的,同一列就是pair 08/23 20:00
20F:→ clsmbstu: 我反而覺得是ggplot跟其它繪圖套件不友善... 08/23 20:00
21F:→ celestialgod: 如果覺得R不友善,就換個工具吧 我覺得這樣最好 08/23 20:01
22F:→ clsmbstu: 既然背後都是non-standard evaluation,為什麼不開放直 08/23 20:02
23F:→ clsmbstu: 接給字串或index數字?反正我一開始都給定data frame了 08/23 20:02
24F:→ celestialgod: 那為什麼你給data.frame,不用欄名 才奇怪吧 08/23 20:03
25F:→ clsmbstu: 我想用欄名啊,啊除了aes_string以外又不吃字串 08/23 20:05
26F:→ celestialgod: 所以我上面跟你說用 formula跟取names做迴圈 08/23 20:05
27F:→ clsmbstu: names叫出來也是字串啊,不能直接給不是也很奇怪嗎? 08/23 20:05
28F:→ celestialgod: 還有 formula != NSE... 08/23 20:06
29F:→ clsmbstu: 而且這裡你給的都只限ggplot,plot_ly function呢? 08/23 20:06
30F:→ celestialgod: plot_ly沒研究,抱歉 08/23 20:06
31F:→ celestialgod: 你如果無法接受這樣的設計 還是上面那句話 換工具 08/23 20:07
32F:→ clsmbstu: 我從來沒有說formula == NSE...... 08/23 20:50
33F:→ clsmbstu: aes的說明直接就寫了"aes uses non-standard evaluation 08/23 20:52
34F:→ clsmbstu: to capture the variable names." 08/23 20:52
35F:→ clsmbstu: 以shiny的例子來說,以下操作就不可能直接實現: 08/23 20:54
36F:→ clsmbstu: ggplot(mtcars,aes(input$a,input$b))+geom_point()+ 08/23 20:55
37F:→ clsmbstu: facet_grid(. ~ input$c) 08/23 20:55
38F:→ clsmbstu: 再來如果用到shiny,我也會想納入plot_ly、leaflet等互 08/23 20:56
39F:→ clsmbstu: 動性更高的套件,那我也只是好奇大家都怎麼解決。 08/23 20:57
40F:→ celestialgod: https://gist.github.com/jcheng5/3239667 08/23 20:58
41F:→ celestialgod: google一下有很多人做這類東西 08/23 20:58
42F:→ celestialgod: 其他套件應該也同理 08/23 20:58
43F:→ clsmbstu: 自問自答:若是ggplot2,facet_grid和facet_wrap都支援 08/24 08:59
44F:→ clsmbstu: 字串輸入,但方式不同,可參考它們的"facets"參數說明 08/24 09:00
※ 編輯: clsmbstu (114.44.107.83), 08/24/2017 09:01:28
45F:→ clsmbstu: 若是plotly與leaflet,目前看起來可一律用paste和 08/24 09:03
46F:→ clsmbstu: as.formula將拼湊起來的字串轉換後送給繪圖函數 08/24 09:05
47F:→ clsmbstu: 常用功能中能夠直接將names函數輸出結果放到繪圖中的, 08/24 09:07
48F:→ clsmbstu: 目前我看到的只有aes_string以及facet_wrap。 08/24 09:08
49F:→ clsmbstu: 另外補充說明:因為aes用的就是non-standard evaluation 08/24 09:33
50F:→ clsmbstu: 所以我上面程式範例中使用eval(parse())的方法,到加入 08/24 09:33
51F:→ clsmbstu: geom_point()看起來結果都是對的,但只要一facet就會出 08/24 09:34
52F:→ clsmbstu: 問題,相關的討論之一我放在原文的連結中,主要還是因為 08/24 09:36
53F:→ clsmbstu: ggplot2內部在繪圖時重新建的data frame會出錯,不過 08/24 09:37
54F:→ clsmbstu: ggplot2並沒有針對這點寫警告訊息,所以需要自己小心。 08/24 09:38







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP