R语言 如何将小提琴图渐变填充为基于Y轴的色标

bnlyeluc  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(158)

我试图根据收入的y轴值为一些小提琴图分配一个色阶/渐变。但是,我只得到了一个白色的小提琴图。我可以根据州、地区而不是收入来更改颜色。

    • 数据**
USA.states <- data.frame(state.region,state.x77)
    • 代码**
p <- ggplot(USA.states,aes(x=state.region,y=Income,fill=Income))+
geom_violin(trim = F,)+
ggtitle("Violin plot of income and Population")

p + scale_fill_gradient(low="red",high="blue")

我将fill赋值给Income,但它最终填充的是白色。

kgsdhlau

kgsdhlau1#

您可以从线段创建伪填充,也可以直接从底层数据(在ggplot_built对象中)创建伪填充。
如果你想要一个额外的多边形轮廓,你仍然需要手动创建多边形,使用为线段计算的x和y坐标。(当然有一个比下面更聪明的方法将其放入数据框中,所以不要把它当作福音)。
另一个值得注意的是,原始情节中的小提琴似乎是按比例缩放的,但我不知 prop 体是如何缩放的,所以我只是用一个常数来缩放它,这个常数是我经过反复试验发现的。

library(tidyverse)

USA.states <- data.frame(state.region,state.x77)
p <- ggplot(USA.states,aes(x=state.region,y=Income,fill=Income))+
  geom_violin(trim = F)

mywidth <- .35 # bit of trial and error
# This is all you need for the fill: 
vl_fill <- data.frame(ggplot_build(p)$data) %>%
  mutate(xnew = x- mywidth*violinwidth, xend = x+ mywidth*violinwidth) 

# Bit convoluted for the outline, need to be rearranged: the order matters
vl_poly <- 
  vl_fill %>% 
  select(xnew, xend, y, group) %>%
  pivot_longer(-c(y, group), names_to = "oldx", values_to = "x") %>% 
  arrange(y) %>%
  split(., .$oldx) %>%
  map(., function(x) {
    if(all(x$oldx == "xnew")) x <- arrange(x, desc(y))
    x
    }) %>%
  bind_rows()

ggplot() +
  geom_polygon(data = vl_poly, aes(x, y, group = group), 
               color= "black", size = 1, fill = NA) +  
  geom_segment(data = vl_fill, aes(x = xnew, xend = xend, y = y, yend = y,
                                   color = y))

reprex package(v1.0.0)于2021年4月14日创建

相关问题