일반적인 원칙을 사용하면 색상 정보를 보유하고 열을 프레임 데이터에 추가해야한다는 것입니다 just like @PoGibas did., 당신은을 포함하여, 당신이 원하는대로 접근하여 그릴 수 있습니다 선택한 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
원래 플로팅 코드는 약간 수정되어 있습니다. 각 공급 업체에 대해 각 제품을 한 번만 사용하는 경우 추가 코드를 추가하지 말고 aes()
문에 y = 1
을 설정하는 것이 좋습니다.

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_point()
을 @PoGibas에 의해 제안하지만,
geom_tile()
그러나

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"))
,이 응용 프로그램에 대한 올바른 기하 구조는, 내 마음에,도
geom_col()
입니다 :
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"))

geom_tile()
을 사용하면 채워진 영역의 높이와 너비, 그리고 플롯의 크기를 조정하거나 가로 세로 비율을 변경하면 이상한 놀라움을 느끼지 않을 것입니다.
설명 해 주셔서 감사합니다. 훌륭한 답변 ... – Vineet