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")
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. –
@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
@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