示例数据集
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以外的其他图形界面是否可行。
答案 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"))
答案 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()
现在我们可以稍微改变主题,让事情看起来更好。
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()
但是,在我看来,这个应用程序的正确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()
使用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"))
,您可以单独定义填充区域的高度和宽度,如果您调整绘图大小或更改其宽高比,您将不会有任何奇怪的意外。