Ví dụ: tôi muốn ánh xạ màu thành z
, với 0 bản đồ thành "trắng".Các cách tiếp cận khác để xử lý các giá trị/phân phối cực đoan khi sử dụng scale_fill_gradient?
> a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12))
> a
x y z
1 1 1 -0.4603911
2 2 1 -0.4868471
3 3 1 0.2180346
4 4 1 -0.8807652
5 5 1 1.7379462
6 6 1 -0.1334904
7 7 1 -0.3675578
8 8 1 0.9225425
9 9 1 -12.0000000
10 10 1 12.0000000
ggplot(a,aes(x=x,y=y,fill=z)) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red")
Như bạn có thể nhìn thấy màu sắc là không thực sự chỉ hữu ích, thay vì truyền đạt một ý tưởng chung về cách các giá trị được phân tán, bây giờ là màu chỉ nói mà giá trị là cực đoan, để lại những giá trị lớn không thể phân biệt bằng mắt chưa qua đào tạo .
Có một phương pháp Non-linear color distribution over the range of values in a geom_raster nhưng có vẻ hơi phức tạp và tôi chỉ có thể mơ hồ hiểu cách hoạt động của nó.
sau đó tôi nghĩ có lẽ order
là một rescale cách tốt, do đó:
ggplot(a,aes(x=x,y=y,fill=ecdf(z)(z))) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red", midpoint=ecdf(a$z)(0))
Nó làm việc chừng mực nào đó (ở đây tôi sử dụng ecdf
thay vì order
để tìm giá trị 0 được rescaled. Tuy nhiên, nhược điểm là, tôi muốn giữ cho các nhãn của huyền thoại là các giá trị chưa được đánh giá, thay vì các giá trị đã được thay đổi kích thước.Vì vậy, một cái gì đó như labels=function(x) quantile(a$z, x)
, mà tôi không thể làm cho nó hoạt động. quantile
để rescale về phía trước và lạc hậu.
Có cách tiếp cận nào tốt hơn hay đơn giản hơn trong các trường hợp này, ví dụ: mạnh mẽ (không cần phải tối ưu hoặc rất chính xác) đủ để lấp đầy màu sắc hợp lý cho tất cả các loại phân phối của các giá trị được ánh xạ.