2017-12-07 20 views
5

Tôi tạo danh sách ggplots được lưu trữ trong một đối tượng có tên là g.a, Đây là mã để tạo lại các ô (dữ liệu được cung cấp ở dưới cùng).scale_fill in ggplot2 - Tạo màu gradient cho mỗi ô trong danh sách các ggplots

Đáng lưu ý rằng tôi có thể thiếu một vấn đề đơn giản và quá phức tạp.

RCfitter <- function(w,h,a,b){(a * ((w + h)^b))} 

fillfactor <- lapply(seq_len(length(dat.a)), function(i) { 
       as.factor((gsub("-.*","",dat.a[[i]]$Date)))}) #I tried as.integer as well 

set.seed(92) 
lin.a <- lapply(seq_len(length(dat.a)), function(i) { 
          data.frame(x = runif(100, -dB.coef.a[3,i], 
          max(dat.a[[i]]$WL)+diff(0.2*range(dat.a[[i]]$Q))))}) 

library(ggplot2) 

g.a <- lapply(seq_len(length(dat.a)), function(i) { 
ggplot() + 
geom_point(data=dat.a[[i]], aes(x=WL,y=Q, tltip = Date, 
fill =fillfactor[[i]]), 
colour = NA, pch=21) + 

scale_fill_manual(breaks = mybreaks, values = myfills)+ 

geom_line(data = lin.a[[i]], 
      aes(x=x,y= RCfitter(x,dB.coef.a[3,i],dB.coef.a[1,i],dB.coef.a[2,i])),colour="red")+ 

xlab("WL") + 
ylab("Q") + 
ggtitle(paste("pLot ",i)) + 
ylim(c(0,(max(dat.a[[i]]$Q)+diff(0.2*range(dat.a[[i]]$Q))))) + 
xlim(c(0,(max(dat.a[[i]]$WL)+diff(0.2*range(dat.a[[i]]$WL))))) + 
theme(legend.position="none") 
           }) 

Nếu tôi bỏ qua scale_fill Tôi có thể vẽ chúng và tôi sẽ nhận được âm mưu "đầy màu sắc". Nhưng với điều đó tôi nhận được cảnh báo này:

g.a[[2]] 

## Warning messages: 
## 1: Removed 6 rows containing missing values (geom_point). 
## 2: Removed 64 rows containing missing values (geom_path). 

Điều này có nghĩa là geom_point không âm mưu gì cả.

Tôi đã sử dụng scale_fill_discrete, scale_fill_continuous, v.v. và chúng cung cấp cho tôi các lỗi như discrete value to continuous scale hoặc ngược lại hoặc.

Những gì tôi thực sự muốn là để tạo ra một màu gradient trong nhiều năm, giả sử từ màu xanh sang màu đỏ, vì vậy tôi có thể phân biệt giữa những năm khi nhìn thấy nếu có một đoạn của năm tương tự (ví dụ 60) xung quanh cùng một chỗ.

P.S. Cuối cùng, tôi đang sử dụng ggplotly() (ví dụ: ggplotly(g.a[[2]],tooltip = c("x","y","tltip")). Vì vậy, nếu điều đó sẽ thay đổi hành vi của scale_fill (ví dụ: một số màu mà tôi đã chỉ định không hợp lệ cho plotly), vui lòng lưu ý điều đó.

mẫu dữ liệu:

dat.a

dat.a <- list(structure(list(Date = c("1974-02-14", "1974-02-16", "1974-02-28", 
    "1974-02-28", "1974-02-28", "1974-02-28"), WL = c(0.24, 0.135, 
    0.395, 0.26, 0.22, 0.31), Q = c(0.237, 0.04, 0.9, 0.36, 0.52,   
    0.56), Velocity = c(0.3, 0.103, 0.367, 0.209, 0.34, 0.276), Area = c(0.79, 
    0.388, 2.452, 1.722, 1.529, 2.029), Flag = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_), 
     Shift = c("/", "/", "/", "/", "/", "/"), date = structure(c(130032000, 
     130204800, 131241600, 131241600, 131241600, 131241600), class = c("POSIXct", 
     "POSIXt"), tzone = "UTC")), .Names = c("Date", "WL", "Q", 
    "Velocity", "Area", "Flag", "Shift", "date"), row.names = c(NA, 
    -6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(   
     Date = c("1965-01-29", "1965-01-29", "1965-04-25", "1966-11-29", 
     "1967-01-24", "1967-11-12"), WL = c(0.439, 0.439, 0.482,  
     0.463, 0.427, 0.475), Q = c(0.252, 0.269, 0.403, 0.314, 0.199, 
     0.4), Velocity = c(0.23, 0.232, 0.316, 0.279, 0.249, 0.36  
     ), Area = c(1.096, 1.159, 1.275, 1.125, 0.799, 1.111), Flag = c(NA_character_, 
     NA_character_, NA_character_, NA_character_, NA_character_,     
     NA_character_), Shift = c("/", "/", "/", "/", "/", "/"),      
     date = structure(c(-155347200, -155347200, -147916800, -97545600,  
     -92707200, -67478400), class = c("POSIXct", "POSIXt"), tzone = "UTC")), 
     .Names = c("Date","WL", "Q", "Velocity", "Area", "Flag", "Shift", "date"), 
     row.names = c(NA,-6L), class = c("tbl_df", "tbl", "data.frame"))) 

dB.coef.a

dB.coef.a <- structure(c(-77.6915945552795, 0.594614568300253, 60.9718752625543, 
    7.96297849987566, 2.69599957356069, -0.183937755444007), .Dim = c(3L,   
    2L), .Dimnames = list(c("a", "b", "h"), NULL)) 

mybreaks

mybreaks <- c(1955, 1956, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 
    1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977,  
    1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988,  
    1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,  
    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,  
    2011, 2012, 2013, 2014, 2015, 2016, 2017) 

myfills

myfills <- c("005ABF", "0358BC", "0757B9", "0A56B6", "0E54B3", "1153B0", 
    "1552AD", "1851AA", "1C4FA7", "1F4EA4", "234DA2", "264B9F", "2A4A9C", 
    "2D4999", "314896", "344693", "384590", "3B448D", "3F428A", "424187", 
    "464085", "493F82", "4D3D7F", "503C7C", "543B79", "573976", "5B3873", 
    "5E3770", "62366D", "65346A", "693368", "6D3265", "703062", "742F5F", 
    "772E5C", "7B2D59", "7E2B56", "822A53", "852950", "89274D", "8C264B", 
    "902548", "932445", "972242", "9A213F", "9E203C", "A11E39", "A51D36", 
    "A81C33", "AC1B30", "AF192E", "B3182B", "B61728", "BA1525", "BD1422", 
    "C1131F", "C4121C", "C81019", "CB0F16", "CF0E13", "D30D11") 
+1

Mã của bạn khá khó đọc. Bạn có thể định nghĩa hàm tạo ra các ô bên ngoài câu lệnh và định dạng 'lapply' độc đáo không? Ngoài ra, nó thường giúp cho khả năng đọc nếu bạn lần đầu tiên thêm tất cả các geoms, sau đó các vảy, sau đó phần còn lại. –

+0

@ClausWilke Đơn giản hóa nó bằng cách làm cho nó ít dày đặc (trực quan) và đưa các tham số bên ngoài vòng lặp, vì vậy bạn có thể nhìn thấy từng phần rõ ràng hơn và tách ra khỏi nhau. Lưu ý rằng đây là một đoạn mã đã được rút ngắn và mã thực tế có nhiều hơn nữa để cung cấp. Trong khi đó, phiên bản đơn giản hóa tạo lại lỗi cho tôi vì vậy chúng ta nên tốt cho việc giải quyết vấn đề đó. – Masoud

+0

@Masoud: Có lý do nào để sử dụng 'pch = 21' và' color = F' cho 'geom_point' không? Tại sao không sử dụng trực tiếp sử dụng 'pch = 16' và sử dụng' color' thay vì 'fill'? – bVa

Trả lời

1

Một gợi ý, nếu tôi một cách chính xác hiểu vấn đề của bạn:

1. Tôi có một thông báo lỗi với màu sắc (myfills):

Lỗi trong grDevices :: col2rgb (màu, TRUE)

# là mất tích:

mycolors <- paste0("#", myfills) # correct colors 
names(mycolors) <- mybreaks # name your colors 
mycolors[names(mycolors) == "1965"] <- "#D30D11" # swapped color to red to check its ok 


2. Nếu bạn thực sự muốn có "màu sắc" với pch = 21 cho geom_point, tốt hơn sử dụng pch = 16, sau đó quên fill thẩm mỹ và sử dụng color thay vì:

g.a <- lapply(seq_len(length(dat.a)), function(i) { 
    ggplot(data = dat.a[[i]], aes(x = WL, y = Q, color = fillfactor[[i]])) + 
    geom_point(pch = 16) + 
    scale_color_manual(values = mycolors) + 
    geom_line(data = lin.a[[i]], aes(x = x, y = RCfitter(x, dB.coef.a[3,i], dB.coef.a[1,i], dB.coef.a[2,i])), colour = "red") + 
    ggtitle(paste("pLot ",i)) + 
    ylim(c(0,(max(dat.a[[i]]$Q) + diff(0.2*range(dat.a[[i]]$Q))))) + 
    xlim(c(0,(max(dat.a[[i]]$WL) + diff(0.2*range(dat.a[[i]]$WL))))) + 
    theme(legend.position="none") 
} 
) 
g.a[[2]] 

enter image description here

3. nhắn cảnh báo về geom_path là do xlim() của bạn.

+0

Trên bộ dữ liệu thực tế và mã chi tiết hơn tôi đã tinh chỉnh xung quanh một số phần khác để có được điều này để làm việc nhưng cuối cùng tôi đã có thể giải quyết vấn đề với đề xuất của bạn. Chúc mừng. – Masoud

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