我正在尝试制作一个简单的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'))) )
这似乎是正确的,即使最后一个bin是错误的(?!)。
但是当我尝试使用较小的垃圾箱时,颜色不对。
有人能帮我理解为什么会这么错吗?或者如果我的代码错了?
问题hist(dt, breaks = 10, col = k)
x
答案 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
中的数据点数。