我有一个如下数据框:
text <- "
brand a b c d e f
nissan 99.21 99.78 6496 1.28 216 0.63
toyota 99.03 99.78 7652 1.39 205 0.60
"
df <- read.table(textConnection(text), sep="\t", header = T)
我正在尝试使用
face_wrap
获取在单个ggplot中绘制的两组的所有变量,如下所示:library(reshape2)
library(ggplot2)
library(ggthemes)
library(RColorBrewer)
ggplot(melt(df, id = "brand")) +
aes(brand, value, fill = brand) +
geom_bar(stat = "identity", position='dodge') +
geom_text(data=melt(df, id = "brand"), angle = 0,
aes(brand, value,
label = ifelse(value > 100, round(value, 0), value) ) ) +
facet_wrap(~ variable, scales = "free_y") +
scale_fill_brewer(palette = "Paired") +
theme(
legend.position = "top",
strip.text.y = element_text(angle = 0),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank()
)
除了一件事,它运作良好。变量值的组之间的明显差异在视觉上无法很好地显示出来。例如,对于变量
a
,我希望条的高度能够以更容易的方式清楚地表明哪一个是较高的。如何获得这样的接近值之间的高度差更大?最佳答案
编辑
(我不打算再讲这个,因为我认为所有答案都在同一侧。但是它不断出现在我的提要上,直到我终于想到一个还未被提及的角度。)
我能想到的在这种情况下使用条形图的合理性的唯一方法是,要非常清楚,条形图的高度代表等级,而不是值:
df2 <- melt(df, id = "brand") %>%
group_by(variable) %>%
mutate(rank = rank(value))
> df2
# A tibble: 12 x 4
# Groups: variable [6]
brand variable value rank
<fctr> <fctr> <dbl> <dbl>
1 nissan a 99.2 2.00
2 toyota a 99.0 1.00
3 nissan b 99.8 1.50
4 toyota b 99.8 1.50
5 nissan c 6496 1.00
6 toyota c 7652 2.00
7 nissan d 1.28 1.00
8 toyota d 1.39 2.00
9 nissan e 216 2.00
10 toyota e 205 1.00
11 nissan f 0.630 2.00
12 toyota f 0.600 1.00
将rank用作y值,其他所有内容都可以自然流动而无需引入
geom_rect()
等:ggplot(df2,
aes(x = brand, y = rank, fill = brand,
label = value)) +
geom_col() +
geom_text(vjust = 0) +
facet_wrap(~variable) +
scale_fill_brewer(palette = "Paired") +
theme(
legend.position="top",
strip.text.y = element_text(angle = 0),
axis.text=element_blank(),
axis.ticks = element_blank()
)
(不包括图表。它基本上与下面的图表相同,除了y轴标题现在为“rank”。)
结果仍然是垃圾图表吗?我会说是的,但是如果您绝对必须向其他人显示任意条形,请告诉他们其高度基于等级,这应该更有意义。
以下是的原始答案
如果确实需要使用条形图,则可以使用
geom_rect
并为每个构面手动定义不同的ymin。修改数据框:
library(dplyr)
df2 <- melt(df, id = "brand") %>%
group_by(variable) %>%
mutate(ymax = value,
ymin = ifelse(diff(value) == 0, 0,
min(value) - (max(value) - min(value)) / 2),
yblank = ifelse(diff(value) == 0, value * 2,
max(value) + (max(value) - min(value)) / 2),
x = as.integer(brand),
xmin = x - 0.4,
xmax = x + 0.4,
label = ifelse(value > 100, round(value, 0), value)) %>%
ungroup()
> df2
# A tibble: 12 x 10
brand variable value ymax ymin yblank x xmin xmax label
<fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 nissan a 99.2 99.2 98.9 99.3 1 0.600 1.40 99.2
2 toyota a 99.0 99.0 98.9 99.3 2 1.60 2.40 99.0
3 nissan b 99.8 99.8 0 200 1 0.600 1.40 99.8
4 toyota b 99.8 99.8 0 200 2 1.60 2.40 99.8
5 nissan c 6496 6496 5918 8230 1 0.600 1.40 6496
6 toyota c 7652 7652 5918 8230 2 1.60 2.40 7652
7 nissan d 1.28 1.28 1.23 1.44 1 0.600 1.40 1.28
8 toyota d 1.39 1.39 1.23 1.44 2 1.60 2.40 1.39
9 nissan e 216 216 200 222 1 0.600 1.40 216
10 toyota e 205 205 200 222 2 1.60 2.40 205
11 nissan f 0.630 0.630 0.585 0.645 1 0.600 1.40 0.630
12 toyota f 0.600 0.600 0.585 0.645 2 1.60 2.40 0.600
这样会创建钢筋,以使每个小平面中较短的钢筋占据小平面高度的四分之一,而较高的钢筋则占据四分之三高度。如果两个钢筋的高度完全相同,则它们都占据小平面高度的一半。如果要调整外观,只需更改ymin / yblank。
情节:
ggplot(df2,
aes(x = x, y = ymax, fill = brand)) +
geom_rect(aes(xmin = xmin, xmax = xmax,
ymin = ymin, ymax = ymax)) +
geom_text(aes(label = label),
vjust = -1) + # position labels slightly above top of each bar
geom_blank(aes(y = yblank)) +
facet_wrap(~ variable, scales = "free_y") +
scale_fill_brewer(palette = "Paired") +
theme(
legend.position="top",
strip.text.y = element_text(angle = 0),
axis.text=element_blank(),
axis.ticks = element_blank()
)
关于r - ggplot-小平面环绕-调整比例以显示值之间的明显差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48199704/