ggplot2 facet - 突出显示匹配的列

时间:2017-12-09 08:20:20

标签: r plot ggplot2 data-visualization

示例数据集

brand=c('MS', 'Google', 'Apple', 'MS', 'FB', 'Apple', 'Oracle')
product=c('OS', 'Search', 'Iphone', 'Search', 'Network', 'OS', 'DB')
df= data.frame(brand, product)

看起来像这样

   brand product
1     MS      OS
2 Google  Search
3  Apple  Iphone
4     MS  Search
5     FB Network
6  Apple      OS
7 Oracle      DB

问题陈述

我正在使用ggplot绘制此图,这里是代码

library(dplyr)
library(ggplot2)
df %>% 
    group_by(brand) %>%
    count(product, sort = TRUE) %>% 
    ggplot(aes(product, n)) +
        geom_col()  + 
        facet_wrap(~brand, ncol = 5, scales = "free_x") + 
        coord_flip()

它会给出这样的图表

现在我们可以看到'搜索'在'谷歌'和'MS'中很常见,而'OS'在'MS'和'Appple'中很常见,我想突出显示两个条形但不知道怎么能我这样做,请建议让我知道除了ggplot以外的其他图形界面是否可行。

enter image description here

2 个答案:

答案 0 :(得分:2)

我解决此问题的方法:使用geom_point()代替构面,如果同一产品出现多次,则指定颜色(还添加了一些小的视觉调整)。

library(ggplot2)

# Define color    
df$myColor <- NA
foo <- df$product %in% names(which(table(df$product) > 1))
df$myColor[foo] <- df$product[foo]

ggplot(df, aes(brand, product, color = myColor)) +
    geom_point(shape = 15, size = 20) +
    scale_color_brewer(guide = FALSE, palette = "Dark2", na.value = "grey") +
    labs(x = NULL,
         y = NULL) +
    theme_classic() +
    theme(axis.ticks = element_blank(),
          axis.text = element_text(size = 15, color = "black"))

enter image description here

答案 1 :(得分:1)

一般原则是你必须在数据框中添加一个包含着色信息的列,just like @PoGibas did.一旦你有了这个列,就可以使用你喜欢的任何方法绘制,包括{{1}你选择的方法。

geom_col()

以下是您的原始绘图代码,略有修改。如果每个供应商只有一次产品,最好在brand=c('MS', 'Google', 'Apple', 'MS', 'FB', 'Apple', 'Oracle') product=c('OS', 'Search', 'Iphone', 'Search', 'Network', 'OS', 'DB') df= data.frame(brand, product) # Define color df$myColor <- NA foo <- df$product %in% names(which(table(df$product) > 1)) df$myColor[foo] <- df$product[foo] df # brand product myColor #1 MS OS 4 #2 Google Search 5 #3 Apple Iphone NA #4 MS Search 5 #5 FB Network NA #6 Apple OS 4 #7 Oracle DB NA 语句中设置y = 1,而不是添加额外的代码来计算。

aes()

enter image description here

现在我们可以稍微改变主题,让事情看起来更好。

library(dplyr)
library(ggplot2)
ggplot(df, aes(x = product, y = 1, fill = factor(myColor))) +
  geom_col()  + 
  facet_wrap(~brand, ncol = 5, scales = "free_x") + 
  guides(fill = "none") +
  coord_flip()

enter image description here

但是,在我看来,这个应用程序的正确geom既不是你使用的ggplot(df, aes(x = product, y = 1, fill = factor(myColor))) + geom_col() + facet_wrap(~brand, ncol = 5) + guides(fill = "none") + scale_y_continuous(breaks = NULL, name = "") + scale_x_discrete(expand = c(0, 0)) + coord_flip() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.ticks = element_blank(), axis.text = element_text(color = "black"), strip.background = element_blank(), panel.background = element_rect(fill="gray95", color="gray95"), panel.spacing = unit(0, "pt")) ,也不是@PoGibas建议的geom_col(),而是geom_point()

geom_tile()

enter image description here

使用ggplot(df, aes(x = brand, y = product, fill = factor(myColor))) + geom_tile(width = 0.9, height = 0.9) + guides(fill = "none") + scale_x_discrete(name = "", position = "top") + scale_y_discrete(name = "") + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.ticks = element_blank(), axis.text = element_text(color = "black"), panel.background = element_rect(fill="gray95")) ,您可以单独定义填充区域的高度和宽度,如果您调整绘图大小或更改其宽高比,您将不会有任何奇怪的意外。