岭图:按值/排名排序
Ridge plot: sort by value / rank
我上传了一个数据集 here 作为 CSV 格式的要点。
它是 YouGov 文章 "How good is 'good'?" 中提供的 PDF 的提取形式。人们被要求用 0(非常消极)和 10(非常积极)之间的分数对单词(例如“完美”、“糟糕”)进行评分。要点恰好包含该数据,即对于每个单词(列:单词),它为从 0 到 10 的每个排名(列:类别)存储投票数(列:总计)。
我通常会尝试使用 matplotlib 和 Python 来可视化数据,因为我缺乏 R 方面的知识,但似乎 ggridges 可以创建比我自己使用 Python 所做的更好的图。
使用:
library(ggplot2)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov, aes(x=Category, y=Word, height = Total, group = Word, fill=Word)) +
geom_density_ridges(stat = "identity", scale = 3)
我能够创建这个情节(离完美还很远):
忽略我必须调整美学的事实,我努力做三件事:
- 按平均排名对单词进行排序。
- 按平均排名为山脊着色。
- 或者用类别值给山脊上色,即用不同的颜色。
我尝试采纳 this source 的建议,但最终失败了,因为我的数据格式似乎有误:我没有单个投票实例,而是已经有了每个类别的汇总投票数.
我希望最终得到一个更接近这个情节的结果,它满足标准 3 (source):
我自己花了一点时间才到达那里。对我来说,关键是理解数据以及如何根据平均 Category
分数对 Word
进行排序。那么我们先来看数据:
> YouGov
# A tibble: 440 x 17
ID Word Category Total Male Female `18 to 35` `35 to 54` `55+`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 Incr~ 0 0 0 0 0 0 0
2 1 Incr~ 1 1 1 1 1 1 0
3 2 Incr~ 2 0 0 0 0 0 0
4 3 Incr~ 3 1 1 1 1 1 1
5 4 Incr~ 4 1 1 1 1 1 1
6 5 Incr~ 5 5 6 5 6 5 5
7 6 Incr~ 6 6 7 5 5 8 5
8 7 Incr~ 7 9 10 8 10 7 10
9 8 Incr~ 8 15 16 14 13 15 16
10 9 Incr~ 9 20 20 20 22 18 19
# ... with 430 more rows, and 8 more variables: Northeast <dbl>,
# Midwest <dbl>, South <dbl>, West <dbl>, White <dbl>, Black <dbl>,
# Hispanic <dbl>, `Other (NET)` <dbl>
每个单词的每个类别(或分数,1-10)都有一行。总计提供该 Word/Category 组合的响应数。因此,尽管没有对 "Incredible" 一词得分为零的回复,但它仍然有一行。
在我们计算每个单词的平均分数之前,我们计算每个单词-类别组合的类别和总分的乘积,我们称之为总分。从那里,我们可以将 Word
视为一个因素,并根据使用 forcats
的平均总分 重新排序 。之后,您可以像以前一样绘制数据。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
YouGov %>%
mutate(total_score = Category*Total) %>%
mutate(Word = fct_reorder(.f = Word, .x = total_score, .fun = mean)) %>%
ggplot(aes(x=Category, y=Word, height = Total, group = Word, fill=Word)) +
geom_density_ridges(stat = "identity", scale = 3)
通过将单词视为一个因素,我们根据单词的平均类别对单词进行了重新排序。 ggplot 还相应地对颜色进行排序,因此我们不必自行修改,除非您更喜欢不同的调色板。
另一个解决方案完全正确。我只是想指出,您可以从 aes()
中调用 fct_reorder()
以获得更紧凑的解决方案。但是,如果要沿 y 轴按位置更改填充颜色,则需要执行两次。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov,
aes(
x = Category,
y = fct_reorder(Word, Category*Total, .fun = sum),
height = Total,
fill = fct_reorder(Word, Category*Total, .fun = sum)
)) +
geom_density_ridges(stat = "identity", scale = 3) +
theme(legend.position = "none")
由 reprex package (v0.3.0)
于 2020 年 1 月 19 日创建
如果您想按 x 位置着色,则可以执行如下操作。它看起来不像温度示例那么好,因为 x 值是离散的。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov,
aes(
x = Category,
y = fct_reorder(Word, Category*Total, .fun = sum),
height = Total,
fill = stat(x)
)) +
geom_density_ridges_gradient(stat = "identity", scale = 3) +
theme(legend.position = "none") +
scale_fill_viridis_c(option = "C")
由 reprex package (v0.3.0)
于 2020 年 1 月 19 日创建
我上传了一个数据集 here 作为 CSV 格式的要点。 它是 YouGov 文章 "How good is 'good'?" 中提供的 PDF 的提取形式。人们被要求用 0(非常消极)和 10(非常积极)之间的分数对单词(例如“完美”、“糟糕”)进行评分。要点恰好包含该数据,即对于每个单词(列:单词),它为从 0 到 10 的每个排名(列:类别)存储投票数(列:总计)。
我通常会尝试使用 matplotlib 和 Python 来可视化数据,因为我缺乏 R 方面的知识,但似乎 ggridges 可以创建比我自己使用 Python 所做的更好的图。
使用:
library(ggplot2)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov, aes(x=Category, y=Word, height = Total, group = Word, fill=Word)) +
geom_density_ridges(stat = "identity", scale = 3)
我能够创建这个情节(离完美还很远):
忽略我必须调整美学的事实,我努力做三件事:
- 按平均排名对单词进行排序。
- 按平均排名为山脊着色。
- 或者用类别值给山脊上色,即用不同的颜色。
我尝试采纳 this source 的建议,但最终失败了,因为我的数据格式似乎有误:我没有单个投票实例,而是已经有了每个类别的汇总投票数.
我希望最终得到一个更接近这个情节的结果,它满足标准 3 (source):
我自己花了一点时间才到达那里。对我来说,关键是理解数据以及如何根据平均 Category
分数对 Word
进行排序。那么我们先来看数据:
> YouGov
# A tibble: 440 x 17
ID Word Category Total Male Female `18 to 35` `35 to 54` `55+`
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 Incr~ 0 0 0 0 0 0 0
2 1 Incr~ 1 1 1 1 1 1 0
3 2 Incr~ 2 0 0 0 0 0 0
4 3 Incr~ 3 1 1 1 1 1 1
5 4 Incr~ 4 1 1 1 1 1 1
6 5 Incr~ 5 5 6 5 6 5 5
7 6 Incr~ 6 6 7 5 5 8 5
8 7 Incr~ 7 9 10 8 10 7 10
9 8 Incr~ 8 15 16 14 13 15 16
10 9 Incr~ 9 20 20 20 22 18 19
# ... with 430 more rows, and 8 more variables: Northeast <dbl>,
# Midwest <dbl>, South <dbl>, West <dbl>, White <dbl>, Black <dbl>,
# Hispanic <dbl>, `Other (NET)` <dbl>
每个单词的每个类别(或分数,1-10)都有一行。总计提供该 Word/Category 组合的响应数。因此,尽管没有对 "Incredible" 一词得分为零的回复,但它仍然有一行。
在我们计算每个单词的平均分数之前,我们计算每个单词-类别组合的类别和总分的乘积,我们称之为总分。从那里,我们可以将 Word
视为一个因素,并根据使用 forcats
的平均总分 重新排序 。之后,您可以像以前一样绘制数据。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
YouGov %>%
mutate(total_score = Category*Total) %>%
mutate(Word = fct_reorder(.f = Word, .x = total_score, .fun = mean)) %>%
ggplot(aes(x=Category, y=Word, height = Total, group = Word, fill=Word)) +
geom_density_ridges(stat = "identity", scale = 3)
通过将单词视为一个因素,我们根据单词的平均类别对单词进行了重新排序。 ggplot 还相应地对颜色进行排序,因此我们不必自行修改,除非您更喜欢不同的调色板。
另一个解决方案完全正确。我只是想指出,您可以从 aes()
中调用 fct_reorder()
以获得更紧凑的解决方案。但是,如果要沿 y 轴按位置更改填充颜色,则需要执行两次。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov,
aes(
x = Category,
y = fct_reorder(Word, Category*Total, .fun = sum),
height = Total,
fill = fct_reorder(Word, Category*Total, .fun = sum)
)) +
geom_density_ridges(stat = "identity", scale = 3) +
theme(legend.position = "none")
由 reprex package (v0.3.0)
于 2020 年 1 月 19 日创建如果您想按 x 位置着色,则可以执行如下操作。它看起来不像温度示例那么好,因为 x 值是离散的。
library(tidyverse)
library(ggridges)
YouGov <- read_csv("https://gist.githubusercontent.com/camminady/2e3aeab04fc3f5d3023ffc17860f0ba4/raw/97161888935c52407b0a377ebc932cc0c1490069/poll.csv")
ggplot(YouGov,
aes(
x = Category,
y = fct_reorder(Word, Category*Total, .fun = sum),
height = Total,
fill = stat(x)
)) +
geom_density_ridges_gradient(stat = "identity", scale = 3) +
theme(legend.position = "none") +
scale_fill_viridis_c(option = "C")
由 reprex package (v0.3.0)
于 2020 年 1 月 19 日创建