我尝试用两种不同的渐变颜色绘制ggplot堆积条形图,用于两个条形图中的每一个。 df中的每个值都被分配一个十六进制的颜色代码。然而,颜色在两个条之间混合。
我尝试了多种方法来解决这个问题,但似乎我还没有完全理解这背后的逻辑。 我可以想象有一个简单而优雅的解决方案。
情况就是这样:
# raw data
values <- c(156182263, 51298256, 673688260, 232926061, 0, 104869535, 398192679, 0, 0, 10782158, 27256840, 70810639, 97336000, 169901000, 0, 51202000, 1261181000, 112863000, 85185000, 61680000, 0, 0, 0)
id <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
# construct the df
df <- data.frame(values, id)
# sort the df by id and values
df <- df[with(df, order(id, -values)), ]
# construct object to use for plotting
dat.m <- melt(df, id.vars = "id")
# generate the color for each value
col_f_a <- colorRampPalette(c("aquamarine2", "white"))
col_a <- col_f_a(length(df$id[df$id == 0]))
col_f_b <- colorRampPalette(c("steelblue1", "white"))
col_b <- col_f_b(length(df$id[df$id == 1]))
# get the colors to their respective value in the object for plotting
cols <- vector()
cols <- append(cols, col_a)
cols <- append(cols, col_b)
dat.m["col"] <- cols
# plot
ggplot(dat.m, aes(x = id, y = value, fill = cols)) +
geom_bar(color = "black", stat = "identity") +
scale_fill_manual(values = cols) +
geom_hline(yintercept = 1000000000, lwd = 2) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
plot.background=element_blank())