Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bar plot parameters #3

Open
cloudly opened this issue Apr 30, 2015 · 13 comments
Open

bar plot parameters #3

cloudly opened this issue Apr 30, 2015 · 13 comments

Comments

@cloudly
Copy link

cloudly commented Apr 30, 2015

以堆叠的条形图为例:
https://echarts.baidu.com/doc/example/bar4.html

可以往series里面加的有stack, itemStyle, barGap, barCategoryGap等等。基本就是说这些bar怎么排列组合,标签怎么弄,柱子宽度高度什么的。

    series : [
        {
            name:'直接访问',
            type:'bar',
            stack: '总量',
            itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
            data:[320, 302, 301, 334, 390, 330, 320]
        },
        {
            name:'邮件营销',
            type:'bar',
            stack: '总量',
            itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
            data:[120, 132, 101, 134, 90, 230, 210]
        },
        {
            name:'联盟广告',
            type:'bar',
            stack: '总量',
            itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
            data:[220, 182, 191, 234, 290, 330, 310]
        },
        {
            name:'视频广告',
            type:'bar',
            stack: '总量',
            itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
            data:[150, 212, 201, 154, 190, 330, 410]
        },
        {
            name:'搜索引擎',
            type:'bar',
            stack: '总量',
            itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
            data:[820, 832, 901, 934, 1290, 1330, 1320]
        }
    ]

你觉得怎么放进来比较合适?data_bar()还是拎另外一个函数出来?

@yihui
Copy link
Owner

yihui commented May 1, 2015

这是个好问题,也是第一个真正有挑战性的问题。我目前设计的data_xxx()系列函数只考虑了计算序列的三个属性:name、type和data。其它的属性如何修改,我刚开始没有细想。

我想这些属性最好是不要通过主函数echart()传进来,因为series只是ECharts众多选项中的一个构成部分,你肯定不希望将来这个函数有几百个参数。

你可以仿照eAxis()的思路想想。这个包的整体设计思路就是拼凑echart()中的params列表,这个列表目前只有三个组成部分:series, xAxis, yAxis。你想完成的是修改其中的series列表,那么你不妨用一个eSeries()函数来做。比如说这样修改第一个series的barCategoryGap属性:

echart() %>% eSeries(which = 1, barCategoryGap = '0%')

具体eSeries()怎么设计你参考一下eAxis(),唯一一点需要清楚的是,chart参数是echart()返回的一坨列表,其中chart$x就是echart()内部的params。

这样设计出来的函数才有通用性。有了eSeries(),你可以修改任何图形的任何序列的任何属性,而不是硬把某个barCategoryGap属性塞在某个函数内(当然你可以后面再写个包装函数,例如eHist(),用来一句话生成直方图)。

回到直方图:我不知道你现在的设计画出来的图形是什么样,但有一点我觉得你没有仔细思考,hist()返回的列表中,breaks的长度比counts多1,你把这两个长度不等的向量摁在一起画图我不知道要闹那样。直方图的难点在于坐标轴的刻度。假设频数在y轴,变量值在x轴,那么y轴的刻度好说,因为它是数值型的坐标轴,ECharts会自动安排刻度,关键在x轴,你用条形图来画的话,意味着x轴是类目型,虽然它实际上应该是数值型,也许你可以用每个区间的中值去代表这个区间,这是问题之一;问题之二在于,怎样选择区间可以使得区间的中值尽量是“整数”,我说的整数是看起来比较整的数字,例如0/0.5/1/1.5等等,如果你用hist()的结果,出来的结果可能不太整,看起来就会不好看,你肯定不愿意读一个横轴刻度是0.123/0.382/0.614/...的直方图,多费劲啊。

思考,好好思考。

@cloudly
Copy link
Author

cloudly commented May 1, 2015

  1. eseries()不错。 我去试试。
  2. 直方图难道不就是大概看一下分布就好了....好吧我去抄hadley在ggplot里面写的代码好了... :P 希望他wrap了一个现成的function。至于离散x轴的问题,我现在看起来还好啊,貌似就是需要往右移动一点就好了。
    screen shot 2015-04-29 at 11 40 41 pm

@yihui
Copy link
Owner

yihui commented May 1, 2015

确实是看个分布就好了,但也得把刻度的位置弄对,以及尽量让刻度上的数字可读。你不能让n个条和n+1个类别去画条形图啊。

又及:是我眼花了还是这x轴上确实附着着很薄一层绿(兰?)色的东西?

@cloudly
Copy link
Author

cloudly commented May 1, 2015

阿哈?蓝色的?xy轴都是蓝色的呀。然后貌似是灰色的背景线和蓝色有点小重叠...

@cloudly
Copy link
Author

cloudly commented May 1, 2015

hist()很体贴的给出了一个mids,这个和counts是一一对应的。那我就暂时go for mids了。目前扔进去一个rnorm(), 以及log(rnorm())还是挺正常的,感觉hist()函数应该考虑过这个问题了。
screen shot 2015-04-30 at 11 16 01 pm

@yihui
Copy link
Owner

yihui commented May 1, 2015

hist()的确考虑了区间边界的“美化”,但你要考虑这个问题:在这里因为我们是用条形图画直方图,x轴上标记的是区间的中值,区间的边界是整数,可能就会意味着中值不是整数,所以你需要想办法做这两件事中的一件:

  • 要么你用hist()的输出,但x轴上的刻度你要用区间(breaks),这意味着你需要把刻度的位置左右移动半个单位;
  • 要么你想办法让区间中值是整数;

@cloudly
Copy link
Author

cloudly commented May 1, 2015

.....我昨天想了一下,如果x本身就是0-1之间的这种的话,也不能直接写成整数。
要不就按照breaks的小数位好了,微调mids。这个记一下,什么时候去改改....

2015-05-01 13:31 GMT-07:00 Yihui Xie [email protected]:

hist()的确考虑了区间边界的“美化”,但你要考虑这个问题:在这里因为我们是用条形图画直方图,x轴上标记的是区间的中值,区间的边界是整数,可能就会意味着中值不是整数,所以你需要想办法做这两件事中的一件:

  • 要么你用hist()的输出,但x轴上的刻度你要用区间(breaks),这意味着你需要把刻度的位置左右移动半个单位;
  • 要么你想办法让区间中值是整数;


Reply to this email directly or view it on GitHub
#3 (comment).

Find me at www.cloudlychen.net

Senior Analyst, Experimentation Research, eBay.
2065 Hamilton Ave, San Jose, CA, 95125

@yihui
Copy link
Owner

yihui commented May 1, 2015

这个你不用太操心,我第一次写整数的时候打了引号,意思是尽量整的数字,只要不是带十八位小数的数字就好。pretty()函数已经做了所有的工作了,例如:

> pretty(runif(10))
[1] 0.0 0.2 0.4 0.6 0.8 1.0

你需要想的只是怎么把它用到直方图中而已。

@cloudly
Copy link
Author

cloudly commented May 1, 2015

嗯,周末有空的话我去改一下。我昨天写了一下加点和线的函数,还没来得及测试...

2015-05-01 14:17 GMT-07:00 Yihui Xie [email protected]:

这个你不用太操心,我第一次写整数的时候打了引号,意思是尽量整的数字,只要不是带十八位小数的数字就好。pretty()函数已经做了所有的工作了,例如:

pretty(runif(10))
[1] 0.0 0.2 0.4 0.6 0.8 1.0

你需要想的只是怎么把它用到直方图中而已。


Reply to this email directly or view it on GitHub
#3 (comment).

Find me at www.cloudlychen.net

Senior Analyst, Experimentation Research, eBay.
2065 Hamilton Ave, San Jose, CA, 95125

@yihui
Copy link
Owner

yihui commented May 1, 2015

测试后发PR记得带图。谢谢。

@cloudly
Copy link
Author

cloudly commented May 1, 2015

记下了,你早说嘛。

On Fri, May 1, 2015 at 2:39 PM, Yihui Xie [email protected] wrote:

测试后发PR记得带图。谢谢。


Reply to this email directly or view it on GitHub
#3 (comment).

Find me at www.cloudlychen.net

Senior Analyst, Experimentation Research, eBay.
2065 Hamilton Ave, San Jose, CA, 95125

@yihui
Copy link
Owner

yihui commented May 1, 2015

看图比看代码容易一些……如果图上有啥问题,我一眼就可以看出来;代码要是有什么问题,我还得思考一下。所以把简单的任务安排在前面。

@cloudly
Copy link
Author

cloudly commented May 1, 2015

果然男人都是视觉的动物

On Friday, May 1, 2015, Yihui Xie [email protected] wrote:

看图比看代码容易一些……如果图上有啥问题,我一眼就可以看出来;代码要是有什么问题,我还得思考一下。所以把简单的任务安排在前面。


Reply to this email directly or view it on GitHub
#3 (comment).

Find me at www.cloudlychen.net

Senior Analyst, Experimentation Research, eBay.
2065 Hamilton Ave, San Jose, CA, 95125

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants