将文本大小映射到 ggplot 中的数据的策略

Strategies in mapping text size to data in ggplot

我想咨询如何将文本 size 映射到 ggplot() 中的数据。在下面这个愚蠢的例子中,我有一些数据描述了一些英文字母和收到的每个字母的“喜欢”平均分数。也就是说,假设我们调查了人们并询问他们,“你在多大程度上喜欢字母 [ ],评分范围为 1-7,其中 1 表示非常不喜欢,7 表示非常喜欢".

出于超出此问题范围的统计原因,我不想使用条形图,因为我试图尽量减少在平均值之间进行比较的愿望.因此,我选择了不同的可视化,如下所示。

我的问题是:我想给观众一种能说明价值观差异的感觉。所以我决定将 geom_text() 的大小映射到实际呈现的值。但是,当我试图让它看起来不错时,这会变得有点棘手。

library(ggplot2)
library(ggforce)

my_df <-
  data.frame(
  letter = letters[1:16],
  mean_liking = c(
    3.663781,
    3.814590,
    3.806543,
    3.788288,
    3.756278,
    4.491339,
    3.549708,
    3.799703,
    3.651306,
    4.522255,
    4.075301,
    5.619614,
    3.917391,
    2.579243,
    3.692090,
    4.439822
  )
)

## scenario 1 -- without mapping size 
ggplot(data = my_df) +
  geom_circle(aes(x0 = 0, y0 = 0, r = 0.5, fill = letter), show.legend = FALSE) +
  geom_text(aes(label = round(mean_liking, 2), x = 0, y = 0)) +
  coord_fixed() +
  facet_wrap(~letter) +
  theme_void()

## scenario 2 --  mapping size "plainly" (so to speak)
ggplot(data = my_df) +
  geom_circle(aes(x0 = 0, y0 = 0, r = 0.5, fill = letter), show.legend = FALSE) +
  geom_text(aes(label = round(mean_liking, 2), x = 0, y = 0, 
                size = mean_liking)) + # <-- mapped here
  coord_fixed() +
  facet_wrap(~letter) +
  theme_void()

  
## scenario 3 --  mapping size multiplied by 10
ggplot(data = my_df) +
  geom_circle(aes(x0 = 0, y0 = 0, r = 0.5, fill = letter), show.legend = FALSE) +
  geom_text(aes(label = round(mean_liking, 2), x = 0, y = 0, 
                size = mean_liking*10)) + # <-- mapped here; getting strange
  coord_fixed() +
  facet_wrap(~letter) +
  theme_void()

reprex package (v2.0.0)

于 2021-08-17 创建

如上所示,方案 2 和方案 3 都导致字母 n 的文本大小不可读。所以我有几个问题:

  1. 尽管乘以 10,为什么文本大小保持不变?
  2. 如何让文本大小根据 mean_liking 值变化?
  3. 是否有任何有用的策略考虑到这些均值是从 1-7 的有限范围生成的这一事实?我想这意味着对如何选择可视化它的一些主观判断,但我非常有兴趣获得更多关于这个的观点。

谢谢!

关于您的问题:

  1. ggplot 实际上并没有获取我们数据的值并直接将它们用作大小值,但它以最小 1 和最大 6 对它们进行缩放。所以无论你如何转换你的数据,结果总是一样的。

  2. 要实际更改大小,您必须使用 scale_size(range = c(min_size, max_size)) 更改大小范围,或者不要将 mean_liking 映射到 size,而是设置大小为 mean_likingaes()

    之外的值
# Mapping mean_liking to size and change size-ranges
ggplot(data = my_df) +
  geom_circle(aes(x0 = 0, y0 = 0, r = 0.5, fill = letter), show.legend = FALSE) +
  geom_text(aes(label = round(mean_liking, 2), x = 0, y = 0, 
                size = mean_liking)) + # <-- mapped here
  scale_size(range = c(4, 8)) + 
  coord_fixed() +
  facet_wrap(~letter) +
  theme_void()

# setting size to the values of mean_liking directly
ggplot(data = my_df) +
  geom_circle(aes(x0 = 0, y0 = 0, r = 0.5, fill = letter), show.legend = FALSE) +
  geom_text(aes(label = round(mean_liking, 2), x = 0, y = 0), 
            size = my_df$mean_liking) + 
  coord_fixed() +
  facet_wrap(~letter) +
  theme_void()
  1. 很遗憾,我这里没有什么好的策略,抱歉。