如何在 R 中创建金字塔条形图,条形之间带有 y 轴标签

Can*_*ice 3 r bar-chart ggplot2

下面是一些使用 ggplot 生成条形图的 R 代码,其中条形向左和向右移动,以 为中心x = 0。我想取 y 轴上的文本(舞台名称),并将它们放在左右条之间。这是创建图形的 R 代码:

library(dplyr)
libary(ggplot2)

# Read data
email_campaign_funnel <- read.csv("https://raw.githubusercontent.com/selva86/datasets/master/email_campaign_funnel.csv")

# X Axis Breaks and Labels 
brks <- seq(-15000000, 15000000, 5000000)
lbls = paste0(as.character(c(seq(15, 0, -5), seq(5, 15, 5))), "m")

# Shorten Names
email_campaign_funnel <- email_campaign_funnel %>%
    dplyr::mutate(Stage = gsub('Stage ', '', Stage)) %>%
    dplyr::mutate(Stage = gsub(' Page', '', Stage)) %>%
    dplyr::mutate(Stage = gsub('Campaign-', '', Stage))

# Plot
ggplot(email_campaign_funnel, aes(x = Stage, y = Users, fill = Gender)) +   # Fill column
    geom_bar(stat = "identity", width = .6) +   # draw the bars
    scale_y_continuous(breaks = brks,   # Breaks
                       labels = lbls) + # Labels
    coord_flip() +  # Flip axes
    labs(title="Email Campaign Funnel") +
    theme(plot.title = element_text(hjust = .5), 
          axis.ticks = element_blank()) +   # Centre plot title
    scale_fill_brewer(palette = "Dark2")  # Color palette
Run Code Online (Sandbox Code Playgroud)

下面是一个不同图形的屏幕截图,它突出显示了我希望文本在条形之间拆分的方式(我更喜欢ggplot()图形的垂直样式,而不是下面图像图形的水平特性)。

在此处输入图片说明 任何有关如何在 R 中执行此操作的想法将不胜感激,谢谢!

Mau*_*ers 5

ggarrangeggpubr包中使用这样的东西怎么样:

gg1 <- email_campaign_funnel %>%
    mutate(Users = if_else(Gender == "Male", Users, 0)) %>%
    ggplot(aes(Stage, Users, fill = Gender)) +
    geom_col(width = 0.6) +
    scale_y_continuous(breaks = brks, labels = lbls) +
    coord_flip() +
    labs(title="Email Campaign Funnel") +
    theme_minimal() +
    scale_fill_manual(values = c("Male" = "Red", "Female" = "Blue")) +
    theme(
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

gg2 <- email_campaign_funnel %>%
    filter(Gender == "Male") %>%
    ggplot(aes(Stage, 0, label = Stage)) +
    geom_text() +
    coord_flip() +
    theme_void()

gg3 <- email_campaign_funnel %>%
    mutate(Users = if_else(Gender == "Female", Users, 0)) %>%
    ggplot(aes(Stage, Users, fill = Gender)) +
    geom_col(width = 0.6) +
    scale_y_continuous(breaks = brks, labels = lbls) +
    coord_flip() +
    labs(title="Email Campaign Funnel") +
    theme_minimal() +
    scale_fill_manual(values = c("Male" = "Red", "Female" = "Blue")) +
    theme(
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())


library(ggpubr)
ggarrange(gg1, gg2, gg3, ncol = 3, common.legend = TRUE, align = "h")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

说明:这个想法是将左右金字塔条形图和中间的标签分开来构建绘图。然后我们ggpubr::ggarrange将所有三个ggplot2绘图对象排列在一行中,并确保轴正确对齐。


拆分水平条形图,中间带有标签

我有兴趣了解我们可以与您链接到的水平金字塔条形图的接近程度。这是我的尝试:

# Sample data
df <- read.table(text =
    "Category Group Value
REB Red 39
REB Blue 35
OREB Red 8
OREB Blue 4
DREB Red 31
DREB Blue 31
AST Red 25
AST Blue 21
STL Red 5
STL Blue 5
BLK Red 1
BLK Blue 0
TOV Red 9
TOV Blue 11", header = T)

# Set factor order
df <- df %>% mutate(Category = factor(Category, unique(Category)))

# Build ggplot2 plot objects
library(tidyverse)
gg1 <- df %>%
    filter(Group == "Red") %>%
    ggplot(aes(Category, Value, fill = Group, label = Value)) +
    geom_col() +
    geom_text(colour = "red3", fontface = "bold", nudge_y = 10) +
    theme_void() +
    scale_fill_manual(values = c("Red" = "red3", "Blue" = "navyblue"), drop = FALSE) +
    ylim(c(0, round(1.5 * max(df$Value))))

gg2 <- df %>%
    filter(Group == "Red") %>%
    ggplot(aes(Category, 0, label = Category)) +
    geom_text(fontface = "bold") +
    theme_void()

gg3 <- df %>%
    filter(Group == "Blue") %>%
    ggplot(aes(Category, -Value, fill = Group, label = Value)) +
    geom_col() +
    geom_text(colour = "navyblue", fontface = "bold", nudge_y = -10) +
    theme_void() +
    scale_fill_manual(values = c("Red" = "red3", "Blue" = "navyblue"), drop = FALSE) +
    ylim(c(round(-1.5 * max(df$Value)), 0))

# Arrange plot objects in 1 column with horizontal scales aligned
library(ggpubr)
ggarrange(gg1, gg2, gg3, nrow = 3, common.legend = TRUE, align = "h", heights = c(1, 0.5, 1))   
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明