Участок хребта: сортировка по значению - PullRequest
4 голосов
/ 16 января 2020

У меня есть набор данных, который я загрузил здесь в виде сущности в формате CSV. Это извлеченная форма PDF-файлов, представленная в статье YouGov «Насколько хорошо« хорошо »?» . Люди, которых попросили оценить слова (например, «отлично», «плохо») со счетом от 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)

Мне удалось создать этот сюжет (который все еще далек от совершенства): enter image description here

Игнорируя тот факт, что я должен настроить эстетику, я борюсь с тремя вещами сделать:

  1. Сортировать слова по их среднему рангу.
  2. Раскрасить гребень по среднему рангу.
  3. Или раскрасить гребень по значению категории, т.е. с изменяющимся цветом.

Я пытался адаптировать предложения из этого источника , но в конечном итоге потерпел неудачу, потому что мои данные, как представляется, в неправильном формате: вместо того, чтобы иметь отдельные экземпляры голосов У меня уже есть аг Gregated подсчет голосов для каждой категории.

Я надеюсь в итоге получить результат, более близкий к этому графику, который удовлетворяет критериям 3 ( source ): enter image description here

Ответы [ 2 ]

5 голосов
/ 16 января 2020

Мне потребовалось немного времени, чтобы добраться туда самому. Ключевой для меня способ понимания данных и порядка заказа Word на основе среднего балла Category. Итак, давайте сначала посмотрим на данные:

> 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 как фактор и изменить порядок на основе среднего общего балла с использованием 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)

enter image description here

Рассматривая Word как фактор, мы переупорядочили слова на основе их средняя категория. ggplot также упорядочивает цвета соответственно, поэтому нам не нужно самим изменять, если вы не предпочитаете другую цветовую палитру.

2 голосов
/ 20 января 2020

Другое решение совершенно верно. Я просто хотел отметить, что вы можете позвонить fct_reorder() из aes() для еще более компактного решения. Однако вам нужно сделать это дважды, если вы хотите изменить цвет заливки по позиции вдоль оси 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")

Создано в 2020-01-19 представьте пакет (v0.3.0)

Если вместо этого вы хотите раскрасить по позиции 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")

Создано в 2020-01-19 представительный пакет (v0.3.0)

...