R - hist按分位数绘制颜色

时间:2015-07-24 13:44:23

标签: r plot histogram

我正在尝试制作一个简单的var myArray = [1,2,3,1,1,3,4]; var counter = {}; for (i = 0; i < myArray.length; i++) { if (myArray.indexOf(myArray[i])>=0) { if(!counter[myArray[i]]){ counter[myArray[i]]=1; } else{ counter[myArray[i]]++; } } } console.log(counter); 绘图,并按hist为其添加颜色。

我想知道为什么当垃圾箱尺寸发生变化时,颜色会变得混乱。 也许我从一开始就没有做到这一点。

分位数是

quantile

然后我用分位数值

设置颜色
quantile(x)
    0%    25%    50%    75%   100% 
    0.00  33.75  58.00  78.25 123.00 

然后当我用更大的箱子绘图时,我得到:

k = ifelse(test = x <= 34, yes = "#8DD3C7", 
no = ifelse(test = (x > 34 & x <= 58), yes =  "#FFFFB3", 
no = ifelse(test = (x > 58 & x <= 79), yes = "#BEBADA", 
no = ifelse(test = (x > 79), yes = "#FB8072", 'grey'))) )                      

enter image description here

这似乎是正确的,即使最后一个bin是错误的(?!)。

但是当我尝试使用较小的垃圾箱时,颜色不对。

enter image description here

有人能帮我理解为什么会这么错吗?或者如果我的代码错了?

问题hist(dt, breaks = 10, col = k)

x

1 个答案:

答案 0 :(得分:1)

这是因为你误解了col的{​​{1}}参数。

hist参数是一个向量,其中col是直方图的col[i] 的颜色。

您的i向量每x 元素一个元素,这比直方图中的条数多出许多。

在第一种情况下,只有k的前13个元素用于着色条(按此顺序),因为只有13个条。在第二种情况下,k的第一个n元素用于对条形图进行着色,其中k是条形数(请参阅小条直方图的前13个条形图)与第一个直方图的前13个颜色相同?)。

如果要按分位数为条形图着色,则必须计算出每个分位数中有多少条形图(而不是多少个数据点),并像这样创建n

要做到这一点,你需要知道直方图断点 - 你的箱子的断点。 k的输出返回一个可以获取断点的对象,依此类推 - 请参阅hist

?hist

要计算出条形应该是的颜色,你可以使用每个条形的起始坐标(# do the histogram counts to get the break points # don't plot yet h <- hist(x, breaks=20, plot=F) # h$breaks and h$mids 的最后一个元素除外),每个条形的结束坐标(除了第一个元素之外) h$breaks)或每个柱的中点坐标(h$breaks)。像上面一样设置你的颜色。

h$mids计算出每个条形的分位数(由条形中点确定);它返回一个整数,其间隔是一个整数,如果它在外面则返回0(虽然根据定义,直方图的每个条形都在第0和第100个分位数之间,所以从技术上讲,你的“灰色”颜色从未使用过)。 findInterval(h$mids, quantile(x), ...)确保100%分位数值包含在最顶部的颜色括号中。 rightmost.closed只是一种很酷/狡猾的方式来cols[findInterval(...)+1];如果您愿意,可以ifelse(h$mids <= ..., "$8DD3C7", ifelse(h$mids <= ..., .....))方式完成。

ifelse

查看cols <- c('grey', "#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072") k <- cols[findInterval(h$mids, quantile(x), rightmost.closed=T, all.inside=F) + 1] # plot the histogram with the colours plot(h, col=k) - 它只与柱状图中的条数一样长,而不是k中的数据点数。