将文本大小映射到 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
的文本大小不可读。所以我有几个问题:
- 尽管乘以
10
,为什么文本大小保持不变?
- 如何让文本大小根据
mean_liking
值变化?
- 是否有任何有用的策略考虑到这些均值是从 1-7 的有限范围生成的这一事实?我想这意味着对如何选择可视化它的一些主观判断,但我非常有兴趣获得更多关于这个的观点。
谢谢!
关于您的问题:
ggplot 实际上并没有获取我们数据的值并直接将它们用作大小值,但它以最小 1 和最大 6 对它们进行缩放。所以无论你如何转换你的数据,结果总是一样的。
要实际更改大小,您必须使用 scale_size(range = c(min_size, max_size))
更改大小范围,或者不要将 mean_liking
映射到 size
,而是设置大小为 mean_liking
在 aes()
之外的值
# 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()
- 很遗憾,我这里没有什么好的策略,抱歉。
我想咨询如何将文本 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
的文本大小不可读。所以我有几个问题:
- 尽管乘以
10
,为什么文本大小保持不变? - 如何让文本大小根据
mean_liking
值变化? - 是否有任何有用的策略考虑到这些均值是从 1-7 的有限范围生成的这一事实?我想这意味着对如何选择可视化它的一些主观判断,但我非常有兴趣获得更多关于这个的观点。
谢谢!
关于您的问题:
ggplot 实际上并没有获取我们数据的值并直接将它们用作大小值,但它以最小 1 和最大 6 对它们进行缩放。所以无论你如何转换你的数据,结果总是一样的。
要实际更改大小,您必须使用
之外的值scale_size(range = c(min_size, max_size))
更改大小范围,或者不要将mean_liking
映射到size
,而是设置大小为mean_liking
在aes()
# 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()
- 很遗憾,我这里没有什么好的策略,抱歉。