2017-07-18 20 views
9

Tôi đang cố gắng tạo một phân tán được tóm tắt bằng các thùng hình lục giác đếm. Tôi muốn người dùng có thể xác định số lần ngắt cho thang màu. Tôi làm việc này, sử dụng scale_fill_manual(). Thật kỳ lạ, tuy nhiên, nó chỉ hoạt động đôi khi. Trong MWe dưới đây, sử dụng giá trị hạt nhất định, nếu xbins=10, có những vấn đề dẫn đến một âm mưu như sau:Chỉ định màu theo cách thủ công với scale_fill_manual chỉ hoạt động đối với một số kích thước hình lục giác nhất định

enter image description here

Tuy nhiên, nếu xbins=20 hoặc 40, ví dụ, những âm mưu không có vẻ có vấn đề:

enter image description here

MWe của tôi là như sau:

library(ggplot2) 
library(hexbin) 
library(RColorBrewer) 

set.seed(1) 
xbins <- 20 

x <- abs(rnorm(10000)) 
y <- abs(rnorm(10000)) 
minVal <- min(x, y) 
maxVal <- max(x, y) 
maxRange <- c(minVal, maxVal) 
buffer <- (maxRange[2] - maxRange[1])/(xbins/2) 
h <- hexbin(x = x, y = y, xbins = xbins, shape = 1, IDs = TRUE, 
      xbnds = maxRange, ybnds = maxRange) 
hexdf <- data.frame (hcell2xy(h), hexID = [email protected], counts = [email protected]) 
my_breaks <- c(2, 4, 6, 8, 20, 1000) 
clrs <- brewer.pal(length(my_breaks) + 3, "Blues") 
clrs <- clrs[3:length(clrs)] 
hexdf$countColor <- cut(hexdf$counts, breaks = c(0, my_breaks, Inf), 
         labels = rev(clrs)) 

ggplot(hexdf, aes(x = x, y = y, hexID = hexID, fill = countColor)) + 
    scale_fill_manual(values = levels(hexdf$countColor)) + 
    geom_hex(stat = "identity") + 
    geom_abline(intercept = 0, color = "red", size = 0.25) + 
    coord_fixed(xlim = c(-0.5, (maxRange[2] + buffer)), 
       ylim = c(-0.5, (maxRange[2] + buffer))) + 
    theme(aspect.ratio=1) 

Mục tiêu của tôi là tinh chỉnh mã này để cốt truyện không có vấn đề (nơi đột nhiên hình lục giác nhất định có kích thước và hình dạng khác với phần còn lại) bất kể giá trị được gán cho xbins. Tuy nhiên, tôi đang bối rối những gì có thể gây ra vấn đề này đối với một số giá trị xbins nhất định. Mọi lời khuyên sẽ được đánh giá cao.

EDIT:

Tôi đang cập nhật mã ví dụ sau khi tính đến các nhận xét của @bdemarest và @Axeman. Tôi đã làm theo câu trả lời phổ biến nhất trong liên kết @Axeman đề xuất và tin rằng nó hữu ích hơn khi bạn đang làm việc với scale_fill_continuous() trên một vectơ nguyên. Ở đây, tôi đang làm việc trên scale_fill_manual() trên một vector yếu tố. Kết quả là, tôi vẫn không thể đạt được mục tiêu này để làm việc. Cảm ơn bạn.

library(ggplot2) 
library(hexbin) 
library(RColorBrewer) 

set.seed(1) 
xbins <- 10 

x <- abs(rnorm(10000)) 
y <- abs(rnorm(10000)) 
minVal <- min(x, y) 
maxVal <- max(x, y) 
maxRange <- c(minVal, maxVal) 
buffer <- (maxRange[2] - maxRange[1])/(xbins/2) 
bindata = data.frame(x=x,y=y,factor=as.factor(1)) 

h <- hexbin(bindata, xbins = xbins, IDs = TRUE, xbnds = maxRange, ybnds = maxRange) 

counts <- hexTapply (h, bindata$factor, table) 
counts <- t (simplify2array (counts)) 
counts <- melt (counts) 
colnames (counts) <- c ("factor", "ID", "counts") 
counts$factor =as.factor(counts$factor) 

hexdf <- data.frame (hcell2xy (h), ID = [email protected]) 
hexdf <- merge (counts, hexdf) 

my_breaks <- c(2, 4, 6, 8, 20, 1000) 
clrs <- brewer.pal(length(my_breaks) + 3, "Blues") 
clrs <- clrs[3:length(clrs)] 
hexdf$countColor <- cut(hexdf$counts, breaks = c(0, my_breaks, Inf), labels = rev(clrs)) 

ggplot(hexdf, aes(x = x, y = y, fill = countColor)) + 
    scale_fill_manual(values = levels(hexdf$countColor)) + 
    geom_hex(stat = "identity") + 
    geom_abline(intercept = 0, color = "red", size = 0.25) + 
    coord_cartesian(xlim = c(-0.5, maxRange[2]+buffer), ylim = c(-0.5, maxRange[2]+ buffer)) + theme(aspect.ratio=1) 
+2

tôi đã nhận thấy rằng mã này: 'aes (hexID = hexID)' doesn không làm gì cả. Cốt truyện là như nhau nếu bạn loại bỏ nó. – bdemarest

+0

Đề xuất của bạn có vẻ không chính xác, cùng một vấn đề xảy ra khi không gán màu thủ công. – Axeman

+0

Điều đó đang được nói, hầu hết nỗi đau này có thể tránh được bằng cách sử dụng 'scale_fill_distiller' và đặt' fill = count'. – Axeman

Trả lời

2

bạn có thể xác định màu sắc trong 'Geom' thay vì 'quy mô' mà sửa đổi quy mô của cốt truyện:

ggplot(hexdf, aes(x = x, y = y)) + 
geom_hex(stat = "identity",fill =hexdf$countColor) 
+0

Tôi rất vui khi thấy thành phần đó có thể được sửa. Tôi đã mở một bài đăng liên quan khác vì giải pháp này giải quyết vấn đề nhất quán kích thước hình lục giác nhưng mất đi truyền thuyết. Nếu có ai quan tâm nhiều hơn về điều này, vui lòng xem (https://stackoverflow.com/questions/46636473/consistent-hexagon-sizes-and-legend-for-manually-assignment-of-colors). –

Các vấn đề liên quan