我有一个如下数据框:

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,我希望条的高度能够以更容易的方式清楚地表明哪一个是较高的。如何获得这样的接近值之间的高度差更大?

r - ggplot-小平面环绕-调整比例以显示值之间的明显差异-LMLPHP

最佳答案

编辑

(我不打算再讲这个,因为我认为所有答案都在同一侧。但是它不断出现在我的提要上,直到我终于想到一个还未被提及的角度。)

我能想到的在这种情况下使用条形图的合理性的唯一方法是,要非常清楚,条形图的高度代表等级,而不是:

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-小平面环绕-调整比例以显示值之间的明显差异-LMLPHP

关于r - ggplot-小平面环绕-调整比例以显示值之间的明显差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48199704/

10-12 19:53