作者celestialgod (天)
看板R_Language
标题Re: [问题] ggplot 画机率分配走势图(NT$300+200)
时间Tue Apr 26 21:25:16 2016
※ 引述《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://webptt.com/cn.aspx?n=bbs/R_Language/M.1461677119.A.A27.html
1F:推 realtemper: 感谢大大辛劳,调试中,尽快回覆 04/26 21:50
试完再跟我说,觉得如何吧
2F:推 realtemper: 感谢大大,已结案! 04/27 00:22
※ 编辑: celestialgod (180.218.152.118), 04/27/2016 00:37:09