簡體   English   中英

R - 按分位數繪制的直方圖顏色

[英]R - hist plot colours by quantile

我正在嘗試做一個簡單的hist plot 並按quantile為 bin 着色。

我想知道為什么當垃圾箱大小改變時,顏色會變得一團糟。 也許我從一開始就沒有做對。

分位數是

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) 

在此處輸入圖片說明

這似乎是正確的,即使最后一個 bin 是錯誤的(?!)。

但是當我嘗試使用較小的垃圾箱時,顏色不正確。

在此處輸入圖片說明

有人能幫我理解為什么是錯的嗎? 或者如果我的代碼是錯誤的?

有問題的x

x = c(23, 23, 16, 16, 34, 34, 43, 43, 97, 97, 63, 63, 39, 39, 29, 
29, 63, 63, 48, 48, 7, 7, 80, 80, 69, 69, 110, 110, 103, 103, 
43, 43, 39, 39, 46, 46, 14, 14, 56, 56, 76, 76, 52, 52, 18, 18, 
32, 32, 66, 66, 70, 70, 26, 26, 40, 40, 105, 105, 62, 62, 51, 
51, 58, 58, 37, 37, 55, 55, 42, 42, 11, 11, 89, 89, 55, 55, 109, 
109, 49, 49, 27, 27, 96, 96, 27, 27, 65, 65, 74, 74, 17, 17, 
33, 33, 89, 89, 63, 63, 18, 18, 25, 25, 36, 36, 108, 108, 3, 
3, 52, 52, 83, 83, 74, 74, 56, 56, 99, 99, 6, 6, 25, 25, 51, 
51, 4, 4, 100, 100, 17, 17, 44, 44, 23, 23, 70, 70, 85, 85, 14, 
14, 22, 22, 89, 89, 45, 45, 2, 2, 29, 29, 14, 14, 69, 69, 96, 
96, 10, 10, 58, 58, 97, 97, 54, 54, 60, 60, 65, 65, 2, 2, 54, 
54, 4, 4, 28, 28, 107, 107, 74, 74, 72, 72, 71, 71, 42, 42, 92, 
92, 64, 64, 39, 39, 111, 111, 72, 72, 73, 73, 58, 58, 41, 41, 
56, 56, 73, 73, 18, 18, 73, 73, 36, 36, 60, 60, 49, 49, 47, 47, 
95, 95, 19, 19, 8, 8, 7, 7, 38, 38, 38, 38, 38, 38, 28, 28, 79, 
79, 53, 53, 30, 30, 19, 19, 14, 14, 53, 53, 68, 68, 39, 39, 42, 
42, 87, 87, 33, 33, 18, 18, 77, 77, 83, 83, 19, 19, 14, 14, 7, 
7, 32, 32, 94, 94, 30, 30, 55, 55, 89, 89, 30, 30, 45, 45, 84, 
84, 38, 38, 59, 59, 73, 73, 77, 77, 22, 22, 55, 55, 31, 31, 52, 
52, 20, 20, 26, 26, 62, 62, 55, 55, 46, 46, 26, 26, 49, 49, 22, 
22, 65, 65, 67, 67, 73, 73, 29, 29, 88, 88, 86, 86, 76, 76, 32, 
32, 12, 12, 19, 19, 14, 14, 8, 8, 63, 63, 63, 63, 65, 65, 84, 
84, 34, 34, 42, 42, 26, 26, 75, 75, 68, 68, 28, 28, 95, 95, 17, 
17, 76, 76, 33, 33, 91, 91, 93, 93, 80, 80, 89, 89, 64, 64, 81, 
81, 98, 98, 47, 47, 70, 70, 46, 46, 11, 11, 92, 92, 69, 69, 95, 
95, 51, 51, 87, 87, 61, 61, 50, 50, 47, 47, 35, 35, 31, 31, 39, 
39, 19, 19, 81, 81, 35, 35, 68, 68, 68, 68, 67, 67, 57, 57, 7, 
7, 9, 9, 23, 23, 50, 50, 89, 89, 41, 41, 54, 54, 53, 53, 57, 
57, 89, 89, 32, 32, 40, 40, 48, 48, 35, 35, 15, 15, 90, 90, 1, 
1, 17, 17, 53, 53, 73, 73, 76, 76, 59, 59, 45, 45, 68, 68, 21, 
21, 37, 37, 33, 33, 51, 51, 61, 61, 31, 31, 15, 15, 23, 23, 29, 
29, 45, 45, 96, 96, 87, 87, 37, 37, 104, 104, 50, 50, 58, 58, 
103, 103, 91, 91, 72, 72, 73, 73, 27, 27, 60, 60, 23, 23, 99, 
99, 28, 28, 78, 78, 27, 27, 82, 82, 63, 63, 34, 34, 84, 84, 62, 
62, 2, 2, 99, 99, 22, 22, 85, 85, 39, 39, 47, 47, 66, 66, 17, 
17, 74, 74, 45, 45, 70, 70, 87, 87, 28, 28, 97, 97, 89, 89, 33, 
33, 50, 50, 79, 79, 86, 86, 69, 69, 91, 91, 75, 75, 52, 52, 76, 
76, 13, 13, 71, 71, 42, 42, 20, 20, 28, 28, 56, 56, 69, 69, 16, 
16, 47, 47, 60, 60, 45, 45, 72, 72, 78, 78, 107, 107, 4, 4, 64, 
64, 88, 88, 9, 9, 3, 3, 10, 10, 92, 92, 41, 41, 5, 5, 35, 35, 
31, 31, 24, 24, 70, 70, 47, 47, 41, 41, 32, 32, 92, 92, 90, 90, 
75, 75, 3, 3, 78, 78, 30, 30, 93, 93, 60, 60, 17, 17, 25, 25, 
48, 48, 70, 70, 69, 69, 66, 66, 76, 76, 104, 104, 31, 31, 72, 
72, 56, 56, 64, 64, 92, 92, 68, 68, 102, 102, 100, 100, 27, 27, 
40, 40, 47, 47, 29, 29, 76, 76, 78, 78, 20, 20, 13, 13, 10, 10, 
113, 113, 17, 17, 61, 61, 69, 69, 65, 65, 16, 16, 100, 100, 5, 
5, 18, 18, 24, 24, 54, 54, 41, 41, 64, 64, 66, 66, 90, 90, 29, 
29, 97, 97, 37, 37, 42, 42, 84, 84, 37, 37, 74, 74, 65, 65, 12, 
12, 49, 49, 31, 31, 108, 108, 9, 9, 93, 93, 71, 71, 39, 39, 70, 
70, 79, 79, 92, 92, 60, 60, 104, 104, 79, 79, 103, 103, 38, 38, 
93, 93, 46, 46, 66, 66, 79, 79, 51, 51, 31, 31, 65, 65, 93, 93, 
25, 25, 22, 22, 91, 91, 123, 123, 51, 51, 34, 34, 64, 64, 31, 
31, 24, 24, 74, 74, 57, 57, 95, 95, 83, 83, 28, 28, 56, 56, 72, 
72, 43, 43, 18, 18, 66, 66, 32, 32, 17, 17, 67, 67, 10, 10, 44, 
44, 66, 66, 57, 57, 89, 89, 57, 57, 55, 55, 18, 18, 78, 78, 82, 
82, 103, 103, 110, 110, 92, 92, 54, 54, 35, 35, 8, 8, 53, 53, 
86, 86, 45, 45, 99, 99, 19, 19, 84, 84, 94, 94, 92, 92, 80, 80, 
69, 69, 45, 45, 22, 22, 59, 59, 9, 9, 41, 41, 72, 72, 24, 24, 
117, 117, 79, 79, 57, 57, 29, 29, 96, 96, 47, 47, 23, 23, 64, 
64, 33, 33, 48, 48, 80, 80, 30, 30, 42, 42, 10, 10, 42, 42, 68, 
68, 46, 46, 58, 58, 39, 39, 82, 82, 79, 79, 80, 80, 89, 89, 85, 
85, 24, 24, 106, 106, 40, 40, 90, 90, 69, 69, 92, 92, 84, 84, 
82, 82, 86, 86, 80, 80, 73, 73, 78, 78, 39, 39, 27, 27, 55, 55, 
100, 100, 63, 63, 21, 21, 46, 46, 94, 94, 6, 6, 45, 45, 66, 66, 
94, 94, 52, 52, 78, 78, 59, 59, 86, 86, 67, 67, 76, 76, 54, 54, 
47, 47, 37, 37, 76, 76, 32, 32, 49, 49, 87, 87, 122, 122, 27, 
27, 82, 82, 51, 51, 50, 50, 22, 22, 32, 32, 99, 99, 77, 77, 54, 
54, 29, 29, 82, 82, 80, 80, 85, 85, 30, 30, 57, 57, 41, 41, 50, 
50, 65, 65, 51, 51, 109, 109, 89, 89, 50, 50, 6, 6, 66, 66, 42, 
42, 48, 48, 88, 88, 67, 67, 89, 89, 109, 109, 80, 80, 64, 64, 
64, 64, 95, 95, 76, 76, 76, 76, 78, 78, 44, 44, 51, 51, 19, 19, 
29, 29, 31, 31, 75, 75, 11, 11, 10, 10, 64, 64, 80, 80, 29, 29, 
73, 73, 67, 67, 38, 38, 27, 27, 23, 23, 74, 74, 79, 79, 49, 49, 
78, 78, 29, 29, 59, 59, 70, 70, 8, 8, 24, 24, 39, 39, 80, 80, 
27, 27, 29, 29, 36, 36, 94, 94, 86, 86, 35, 35, 84, 84, 99, 99, 
83, 83, 92, 92, 81, 81, 58, 58, 2, 2, 64, 64, 75, 75, 29, 29, 
53, 53, 58, 58, 11, 11, 38, 38, 83, 83, 108, 108, 86, 86, 56, 
56, 12, 12, 84, 84, 76, 76, 38, 38, 54, 54, 37, 37, 27, 27, 61, 
61, 83, 83, 37, 37, 59, 59, 81, 81, 76, 76, 70, 70, 61, 61, 101, 
101, 77, 77, 68, 68, 74, 74, 83, 83, 70, 70, 93, 93, 53, 53, 
64, 64, 89, 89, 1, 1, 53, 53, 67, 67, 81, 81, 71, 71, 51, 51, 
85, 85, 35, 35, 67, 67, 53, 53, 37, 37, 31, 31, 65, 65, 82, 82, 
47, 47, 60, 60, 81, 81, 21, 21, 94, 94, 75, 75, 92, 92, 113, 
113, 93, 93, 84, 84, 77, 77, 82, 82, 84, 84, 58, 58, 83, 83, 
84, 84, 80, 80, 1, 1, 49, 49, 73, 73, 22, 22, 99, 99, 74, 74, 
28, 28, 33, 33, 74, 74, 91, 91, 83, 83, 70, 70, 99, 99, 69, 69, 
38, 38, 68, 68, 47, 47, 61, 61, 47, 47, 70, 70, 85, 85, 20, 20, 
100, 100, 3, 3, 49, 49, 100, 100, 85, 85, 54, 54, 8, 8, 3, 3, 
47, 47, 46, 46, 45, 45, 27, 27, 87, 87, 20, 20, 24, 24, 51, 51, 
50, 50, 105, 105, 73, 73, 13, 13, 18, 18, 51, 51, 75, 75, 55, 
55, 62, 62, 85, 85, 56, 56, 51, 51, 66, 66, 74, 74, 63, 63, 2, 
2, 81, 81, 85, 85, 19, 19, 16, 16, 83, 83, 36, 36, 79, 79, 63, 
63, 41, 41, 45, 45, 76, 76, 62, 62, 67, 67, 74, 74, 92, 92, 47, 
47, 41, 41, 80, 80, 57, 57, 100, 100, 66, 66, 58, 58, 65, 65, 
59, 59, 20, 20, 54, 54, 10, 10, 79, 79, 64, 64, 106, 106, 44, 
44, 28, 28, 41, 41, 49, 49, 80, 80, 61, 61, 20, 20, 75, 75, 59, 
59, 93, 93, 32, 32, 38, 38, 30, 30, 41, 41, 8, 8, 8, 8, 54, 54, 
56, 56, 83, 83, 81, 81, 77, 77, 42, 42, 59, 59, 11, 11, 21, 21, 
77, 77, 84, 84, 86, 86, 84, 84, 34, 34, 48, 48, 80, 80, 92, 92, 
18, 18, 66, 66, 40, 40, 45, 45, 60, 60, 80, 80, 2, 2, 5, 5, 84, 
84, 66, 66, 70, 70, 70, 70, 95, 95, 62, 62, 0, 0, 67, 67, 61, 
61, 71, 71, 73, 73, 82, 82, 45, 45, 54, 54, 43, 43)

這是因為您誤解了histcol參數。

col參數是一個向量,其中col[i]是直方圖第i的顏色。

您的k向量x 的每個元素一個元素,這比直方圖中的條數多得多。

在第一種情況下,只有k的前 13 個元素用於為條形着色(按此順序),因為只有 13 個條形。 在第二種情況下, k的前n元素用於為條形着色,其中n是條形的數量(查看小塊直方圖的前 13 個條形如何與第一個直方圖的前 13 個條形具有相同的顏色?)。

如果要按分位數為條形着色,則必須計算每個分位數中有多少條形(而不是多少數據點),然后像這樣創建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 )。 像上面一樣設置顏色。

findInterval(h$mids, quantile(x), ...)出每個柱線所在的分位數(由柱線的中點確定); 它返回一個整數,它在哪個區間內,如果它在外面,則返回 0(盡管根據定義,直方圖的每個條形都在第 0 個和第 100 個分位數之間,因此從技術上講,您的“灰色”顏色從未使用過)。 rightmost.closed確保 100% 分位數值包含在最頂部的顏色括號中。 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 - 它只與直方圖中的條形數量一樣長,而不是與x中數據點的數量一樣長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM