Re: [問題] ggplot 畫機率分配走勢圖(NT$300+200)
※ 引述《realtemper (Be pythonic!)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: 註:賞金限首殺者,自動分組的部分跟主要問題分開,詳見內文
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 問題應該算常見,看標題就明白,但做起來卻難如登天 怎麼做怎麼錯
: 我的資料長這樣(公司資料無法攜出 勞煩解答者自行按下面說明稍微模擬一下)
: tableA
: GP N N_valid
: ---------------------
: 1 300 120
: 2 225 55
: 3 145 42
: 4 101 45
: ....
: 52 5 3
: 53 1 1
: 55 2 0
: 58 2 2
: 63 1 0
: 79 2 1
: 97 1 0
: tableA 是一個 pre-summarized 的次數分布圖:
: GP 是整數,由小排到大,但並不 consecutive
: N 代表某 GP 值的事件數
: N_valid 代表成功事件數,0 <= N_valid <= N
: 並且這張表有一個特性
: 就是 N 愈到後面愈稀疏
: 如果 N = N_valid = 0 則不會出現該 GP 的 row, 例如 GP=80
: 我想做的事情也很簡單:
: 畫出成功機率 (N_valid / N) vs GP 的走勢圖
: 實際上應該會是 sum(N_valid)/sum(N) "group by 每個bins" 的概念
: 並且因為GP愈大,N值愈稀疏,所以組距也必須設定為愈後面愈寬
: 要不然每組的樣本數不夠,機率的上下跳動幅度會太大
: 目前還想不到什麼好方法來做自動化的計算
: 所以就先手動設定 breaks = c(5,10,15,20,30,50)
: (如果可以自動化,也希望一併提供solution,賞金額外再給$200)
: 我嘗試弄了一段程式碼如下
: hist <- ggplot(tableA, aes(x=GP)) +
: geom_bar(aes(y=sum(N_valid)/sum(N)),
: breaks=breaks,
: stat='identity') +
: scale_y_continuous(labels=percent)
: hist
: 反正就先設好資料,再設好圖層跟軸,最後座標軸等修飾屬性套上去
: ggplot 的 code 基本也就長這樣
: 結果雖然有圖,但是不work,跑出一堆黑白相間的條紋,scale 也完全不對。
: (資料在公司 無法連網請見諒)
: 這問題太 subtle 了
: stackoverflow 無果
: 性質最接近的帖子如下
: http://stackoverflow.com/questions/15664202/how-to-interpret-the-different-ggplot2-densities
: http://stackoverflow.com/questions/15733531/specifying-number-of-breaks-with-scales-in-ggplot2-without-a-transform/15734133#15734133
: http://stackoverflow.com/questions/15651084/error-with-ggplot2-mapping-variable-to-y-and-using-stat-bin
: 但都不是我所需要的(當然也可能是我程度太差看不懂)
: google 關鍵字也不知道要怎麼下
: 因為工作關係沒有辦法在這個問題上浪費太多時間
: 故在此直接出 $300 徵答(如有辦法不用手動設定breaks再加$200)
: 請意者作答後,把匯款方式寄站內信給我(我付款後要再麻煩您推文告知已收到)
: 感謝大大熱心!
library(pipeR)
library(dplyr)
library(ggplot2)
# data generation
prob_f <- function(x) x %>>% (.^2/2+3*.-3) %>>% (./sum(.)) %>>% rev
sample_f <- function(x) sort(sample(x, 60, prob = prob_f(x)))
table_A <- data.frame(GP = sample_f(1:100), N = rev(sample_f(1:400))) %>>%
mutate(N_valid = sapply(N, function(x) rbinom(1, x, 0.6)))
# find the breaks
find_breaks_f <- function(x){
seq(log(5), log(round(max(x)/100)*100),
length.out = round(length(x)/11)) %>>%
exp %>>% c(0) %>>% sort %>>% return
}
breaks <- find_breaks_f(table_A$GP)
# find the probability of success by breaks
table_for_graph <- mutate(table_A, group = findInterval(GP, breaks)) %>>%
group_by(group) %>>% summarise(prob_success = sum(N_valid) / sum(N)) %>>%
mutate(x = breaks %>>% ((head(., length(.)-1) + tail(., length(.)-1))/2 ))
# plot
ggplot(table_for_graph, aes(x = x, y=prob_success)) + geom_line() +
ylab("Probabilities") + xlab("")
%>>%網路上有很詳細的解釋 (跟%>%不相容)
dplyr的相關內容a我的id吧
我這裡只是用直覺去做而已,我不知道合不合用,試試看吧
: [程式範例]:
: 請見問題敘述後半段(公司資料保密無法連網請見諒)
: [環境敘述]:
: 摘要如下
: R 3.2.1 win7 x64 SP1
: platform: x86_64-w64-mingw32/x64 (64-bit)
: 有library(ggplot2)
: library(scales)
: [關鍵字]:
: ggplot
: geom_histogram
: geom_bar
: summary function
: density
--
: 順便再問一下
: 為什麼我想上網 RTFM 卻沒有一個地方給我 RTFM (例如python就有python docs)
: 只能在一堆非結構化的散亂網頁當中連來連去
: https://cran.r-project.org/index.html
: https://cran.r-project.org/manuals.html
: http://stat.ethz.ch/R-manual/
: https://www.r-project.org/other-docs.html
: 是不是大家學R真的全靠help()跟example()就可以了呢?
好的help可以讓你懂那個套件在幹嘛,用心的作者還會寫tutorial or vignettes
而遇到一些問題,常常爬stackoverflow都能找到解答
不過畫圖這種東西,我覺得個人要的不同,很難找答案
不如自己想辦法畫吧
: 在網路上沒有一個像python docs的集中地 個人覺得是UX上的一個致命缺陷
這我不清楚,我不熟python
: 當然個人學習 靠help()跟example()是OK的沒錯
: 問題是你要demo,要推廣,要做教學
demo, 推廣, 教學,有R console也夠阿,不懂為啥要Rstudio
而且Rstudio可以直接按Open in new windows,不用拉來拉去
自備一台筆電最重要 (我自己都用桌機還敢說別人XD
有自己的筆電有自己的環境才適合做更多事情
版上沒有自己筆電應該少之又少(攤手
如果是公司電腦就比較難辦了(攤手
: 你所在的環境不一定容許你預先裝好Rstudio
: 例如,公司電腦,或者手機(出門在外需要討論問題查資料)
: 而且初學者通常不喜歡打指令,
初學者之所以初學者就是要學,不喜歡打指令只能慢慢習慣
你選擇了這個工具只能去習慣這個工具
不然就去用SAS EG, spss, pspp, minitab之類的吧
: 更不喜歡每打一次指令就要跑去把Rstudio的說明視窗拉大
上面有說
: 我也很好奇大家是怎麼面對這個困擾的 @@
--
R資料整理套件系列文:
magrittr #1LhSWhpH (R_Language) http://tinyurl.com/j3ql84c
data.table #1LhW7Tvj (R_Language) http://tinyurl.com/hr77hrn
dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/jtg4hau
dplyr(下) #1Lhw8b-s (R_Language)
tidyr #1Liqls1R (R_Language) http://tinyurl.com/jq3o2g3
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.152.118
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1461677119.A.A27.html
推
04/26 21:50, , 1F
04/26 21:50, 1F
試完再跟我說,覺得如何吧
推
04/27 00:22, , 2F
04/27 00:22, 2F
※ 編輯: celestialgod (180.218.152.118), 04/27/2016 00:37:09
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):