1 发散条图

Diverging Bars

1.1 geom_linerange

Code
library(data.table)
library(tidyverse)
#> Warning: package 'purrr' was built under R version 4.5.2
#> Warning: package 'stringr' was built under R version 4.5.2
#> Warning: package 'forcats' was built under R version 4.5.2
#> ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
#> ✔ dplyr     1.1.4     ✔ readr     2.1.6
#> ✔ forcats   1.0.1     ✔ stringr   1.6.0
#> ✔ ggplot2   4.0.1     ✔ tibble    3.3.0
#> ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
#> ✔ purrr     1.2.0     
#> ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::between()     masks data.table::between()
#> ✖ dplyr::filter()      masks stats::filter()
#> ✖ dplyr::first()       masks data.table::first()
#> ✖ lubridate::hour()    masks data.table::hour()
#> ✖ lubridate::isoweek() masks data.table::isoweek()
#> ✖ dplyr::lag()         masks stats::lag()
#> ✖ dplyr::last()        masks data.table::last()
#> ✖ lubridate::mday()    masks data.table::mday()
#> ✖ lubridate::minute()  masks data.table::minute()
#> ✖ lubridate::month()   masks data.table::month()
#> ✖ lubridate::quarter() masks data.table::quarter()
#> ✖ lubridate::second()  masks data.table::second()
#> ✖ purrr::transpose()   masks data.table::transpose()
#> ✖ lubridate::wday()    masks data.table::wday()
#> ✖ lubridate::week()    masks data.table::week()
#> ✖ lubridate::yday()    masks data.table::yday()
#> ✖ lubridate::year()    masks data.table::year()
#> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
df <- datasets::mtcars %>% data.table() %>% .[,cars:=rownames(mtcars)]

df[,mpg_z:=scale(mpg)]
df[mpg_z>0,mpg_c:="g"]
df[mpg_z<0,mpg_c:="r"]
Code
ggplot(df,aes(y=reorder(cars,mpg_z),colour = mpg_c))+
    geom_linerange(aes(xmin = 0,
                       xmax = mpg_z),
                   linewidth=2,alpha=.5,show.legend = F)+
    scale_color_manual(values = c("r"="red","g"="green"))+
    scale_x_continuous(limits = c(-2,2.5),breaks = seq(-2,2.5,0.5),expand = c(0,0.02))+
    scale_y_discrete(expand = c(0.03,0.03))+
    labs(x="Mileage",y="Model",title = "Diverging Bars of Car Mileage")+
    theme_bw()+
    theme(
        aspect.ratio = 1/1.3,
        axis.ticks = element_blank(),
        axis.title = element_text(face = "italic"),
        axis.text.y = element_text(size = 8),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = .5)
    )+
    geom_text(
        data = df[mpg_c=="g"],
        mapping = aes(x=mpg_z,label = sprintf("%.2f",mpg_z)),hjust = 0,colour = "green4",size = 2
    )+
    geom_text(
        data = df[mpg_c=="r"],
        mapping = aes(x=mpg_z,label = sprintf("%.2f",mpg_z)),hjust = 1,colour = "red4",size = 2
    )

1.2 geom_segment

Code
ggplot(df)+
    geom_segment(aes(x = 0,xend = mpg_z,
                     y=reorder(cars,mpg_z),yend =reorder(cars,mpg_z),
                     colour=mpg_c),
                   linewidth=2,alpha=.5,show.legend = F)+
    scale_color_manual(values = c("r"="red","g"="green"))+
    scale_x_continuous(limits = c(-2,2.5),breaks = seq(-2,2.5,0.5),expand = c(0,0.02))+
    scale_y_discrete(expand = c(0.03,0.03))+
    labs(x="Mileage",y="Model",title = "Diverging Bars of Car Mileage")+
    theme_bw()+
    theme(
        aspect.ratio = 1/1.3,
        axis.ticks = element_blank(),
        axis.title = element_text(face = "italic"),
        axis.text.y = element_text(size = 8),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = .5)
    )

1.3 geom_bar

Code
ggplot(df,aes(x=reorder(cars,mpg_z),y=mpg_z,fill = mpg_c))+
    geom_bar(stat = "identity",
                   width=0.5,alpha=.5,show.legend = F)+
    scale_fill_manual(values = c("r"="red","g"="green"))+
    scale_y_continuous(limits = c(-2,2.5),breaks = seq(-2,2.5,0.5),expand = c(0,0.02))+
    scale_x_discrete(expand = c(0.03,0.03))+
    labs(x="Mileage",y="Model",title = "Diverging Bars of Car Mileage")+
    theme_bw()+
    theme(
        aspect.ratio = 1/1.3,
        axis.ticks = element_blank(),
        axis.title = element_text(face = "italic"),
        axis.text.y = element_text(size = 8),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = .5)
    )+
    coord_flip()

Back to top