带有渐变填充的geom_boxplot

问题描述 投票:0回答:1

我尝试在我的

value
中放入渐变填充列
dput
(参见下面的
geom_boxplot
数据框示例)以获得类似this的内容,但是我只成功使用了
Period
中的
fill
,这样如:

library(ggplot2)

ggplot(df, 
       aes(x=Period, ymin=min, lower=min, fill=Period,
           middle=0, upper=max, ymax=max)) +
  geom_boxplot(stat="identity")

可重现的示例数据:

df <- structure(list(value = c(-0.256008390785499, -0.24004506049582, -0.250828695705342, 
    -0.267190101219487, -0.316647825400329, -0.366330881072921, 
    -0.349098289022608, -0.341879051913029, -0.368308158446536, 
    -0.377816620860917, -0.412561020729726, -0.458235576769901, 
    -0.438308012743532, -0.423376509219582, -0.446750016179227, 
    -0.456357816345701, -0.494158454876249, -0.546914450257824, 
    -0.457499662919834, -0.443757432245947, -0.472335096128546, 
    -0.49378723945037, -0.547975868432454, -0.600343358251158, 
    -0.406085464722591, -0.394433985798893, -0.420042741441662, 
    -0.431297210839104, -0.473576129192589, -0.527286933402277
    ), Period = c("1951-1980", "1951-1980", "1951-1980", "1951-1980", 
    "1951-1980", "1951-1980", "1981-2010", "1981-2010", "1981-2010", 
    "1981-2010", "1981-2010", "1981-2010", "2011-2040", "2011-2040", 
    "2011-2040", "2011-2040", "2011-2040", "2011-2040", "2041-2070", 
    "2041-2070", "2041-2070", "2041-2070", "2041-2070", "2041-2070", 
    "2071-2100", "2071-2100", "2071-2100", "2071-2100", "2071-2100", 
    "2071-2100"), max = c(0.815576174565362, 0.815576174565362, 
    0.815576174565362, 0.815576174565362, 0.815576174565362, 
    0.815576174565362, 0.801648736136538, 0.801648736136538, 
    0.801648736136538, 0.801648736136538, 0.801648736136538, 
    0.801648736136538, 0.766267272755767, 0.766267272755767, 
    0.766267272755767, 0.766267272755767, 0.766267272755767, 
    0.766267272755767, 0.76577744142212, 0.76577744142212, 0.76577744142212, 
    0.76577744142212, 0.76577744142212, 0.76577744142212, 0.771953608938838, 
    0.771953608938838, 0.771953608938838, 0.771953608938838, 
    0.771953608938838, 0.771953608938838), min = c(-0.558861617596901, 
    -0.558861617596901, -0.558861617596901, -0.558861617596901, 
    -0.558861617596901, -0.558861617596901, -0.591774302902796, 
    -0.591774302902796, -0.591774302902796, -0.591774302902796, 
    -0.591774302902796, -0.591774302902796, -0.762911874447465, 
    -0.762911874447465, -0.762911874447465, -0.762911874447465, 
    -0.762911874447465, -0.762911874447465, -0.875343482743915, 
    -0.875343482743915, -0.875343482743915, -0.875343482743915, 
    -0.875343482743915, -0.875343482743915, -1.03089239970852, 
    -1.03089239970852, -1.03089239970852, -1.03089239970852, 
    -1.03089239970852, -1.03089239970852)), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 8924L, 8925L, 8926L, 8927L, 8928L, 8929L, 
17847L, 17848L, 17849L, 17850L, 17851L, 17852L, 44616L, 44617L, 
44618L, 44619L, 44620L, 44621L, 71385L, 71386L, 71387L, 71388L, 
71389L, 71390L), class = "data.frame")
r ggplot2 boxplot
1个回答
0
投票

要获得您想要的绘图,您应该使用

geom_tile
,首先进行一些数据管理。

group_by(df, Period) |>
  distinct(max, min) |>
  expand(value=seq(min, max, by=0.01)) |>
  ggplot(aes(x=Period, y=value)) +
  geom_tile(aes(fill=value), width=0.8, height=0.01) +
  geom_segment(y=0, yend=0, linewidth=2,
               aes(x=as.numeric(as.factor(Period))-0.4,
                   xend=as.numeric(as.factor(Period))+0.4)) +
  scale_fill_gradient2(low = 'blue', mid = 'grey', high = 'red', midpoint = 0) +
  guides(fill=guide_none()) +
  theme_classic()

enter image description here

您实际上只使用了数据框的 5 行。这是用于绘图的实际数据:

group_by(df, Period) |>
   distinct(max, min)
# A tibble: 5 × 3
# Groups:   Period [5]
  Period      max    min
  <chr>     <dbl>  <dbl>
1 1951-1980 0.816 -0.559
2 1981-2010 0.802 -0.592
3 2011-2040 0.766 -0.763
4 2041-2070 0.766 -0.875
5 2071-2100 0.772 -1.03 

然后我们需要展开以获得渐变颜色。

expand(value=seq(min, max, by=0.01))
# A tibble: 777 × 2
# Groups:   Period [5]
   Period     value
   <chr>      <dbl>
 1 1951-1980 -0.559
 2 1951-1980 -0.549
 3 1951-1980 -0.539
 4 1951-1980 -0.529
 5 1951-1980 -0.519
 6 1951-1980 -0.509
 7 1951-1980 -0.499
 8 1951-1980 -0.489
 9 1951-1980 -0.479
10 1951-1980 -0.469
# ℹ 767 more rows
© www.soinside.com 2019 - 2024. All rights reserved.