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

时间:2019-01-15 01:02:50

标签: r ggplot2 bar-chart

下面是一些R代码,它们使用ggplot生成条形图,其中条形以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

下面是另一个图形的屏幕截图,该图形突出显示了我希望文本如何在小节之间进行拆分的一种方式(我更喜欢ggplot()图形的垂直样式,而不是水平图形的水平样式)。下图所示)。

enter image description here 非常感谢您对R中如何执行此操作的任何想法,谢谢!

1 个答案:

答案 0 :(得分:3)

如何使用ggarrange包中的ggpubr这样的东西:

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")

enter image description here

说明:该想法是与左侧和右侧金字塔条形图以及中间的标签分开构建图。然后,我们使用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))   

enter image description here