ggRadar выделяет верхние значения в радаре

Привет всем, я делаю радарную диаграмму и хочу выделить два самых высоких значения факторов или уровней. Изюминкой в ​​этом случае является выделение текста верхних значений дерева жирным шрифтом.

require(ggplot2)
require(ggiraph)
require(plyr)
require(reshape2)
require(moonBook)
require(sjmisc)
ggRadar(iris,aes(x=c(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width)))

пример может быть таким

Изображение

благодарю вас


person mauron    schedule 19.06.2020    source источник
comment
Какая величина изображена на радиальной оси? Например, Sepal.Width принимает значение около 0,44. Как рассчитывается это значение?   -  person Maurits Evers    schedule 19.06.2020
comment
Это происходит непосредственно из данных, я предполагаю, что это не расчет, просто чтобы выделить три верхних значения. В моем реальном приложении данные дословно поступают из опроса.   -  person mauron    schedule 19.06.2020
comment
Да, я понимаю это. Но чтобы выделить определенные верхние категории, нам нужно понять, как рассчитываются эти значения. iris содержит 150 измерений 4 переменных (категорий). Каким-то образом ggRadar показывает одно значение для каждой категории, а вам нравится выделять три верхние категории. Как рассчитываются эти отдельные значения?   -  person Maurits Evers    schedule 20.06.2020
comment
Hi Maurits в этом случае должно быть наивысшим значением вида для каждой переменной   -  person mauron    schedule 21.06.2020


Ответы (2)


Вот пошаговый пример того, как выделить определенные категории на радиолокационном графике. Я не вижу смысла во всех этих дополнительных зависимостях (ggRadar и т. д.), так как довольно просто нарисовать радарную диаграмму в ggplot2 напрямую, используя полярные координаты.

  1. Во-первых, давайте сгенерируем некоторые образцы данных. Согласно комментариям ОП и его примеру, основанному на наборе данных iris, мы выбираем максимальное значение для каждой переменной (из Sepal.Length, Sepal.Width, Petal.Length, Petal.Width); затем мы сохраняем результат в длинном tibble для построения графика.

    library(purrr)
    library(dplyr)
    library(tidyr)
    df <- iris %>% select(-Species) %>% map_df(max) %>% pivot_longer(everything())
    df
    #    # A tibble: 4 x 2
    #  name         value
    #  <chr>        <dbl>
    #1 Sepal.Length   7.9
    #2 Sepal.Width    4.4
    #3 Petal.Length   6.9
    #4 Petal.Width    2.5
    
  2. Затем мы используем пользовательскую функцию coord_radar (благодаря этот пост), который сосредоточен вокруг coord_polar и гарантирует, что линии многоугольника на полярном графике будут прямыми линиями, а не изогнутыми дугами.

    coord_radar <- function (theta = "x", start = - pi / 2, direction = 1) {
        theta <- match.arg(theta, c("x", "y"))
        r <- if (theta == "x") "y" else "x"
        ggproto(
            "CordRadar", CoordPolar, theta = theta, r = r, start = start,
            direction = sign(direction),
            is_linear = function(coord) TRUE)
    }
    
  3. Теперь мы создаем новый столбец df$face со значением "bold" для трех верхних переменных (ранжированных по убыванию value) и "plain" в противном случае. Мы также должны убедиться, что factor уровни наших категорий отсортированы по номеру строки (иначе name и face позже не обязательно совпадут).

    df <- df %>%
        mutate(
            rnk = rank(-value),
            face = if_else(rnk < 4, "bold", "plain"),
            name = factor(name, levels = unique(name)))
    
  4. Теперь мы можем нарисовать сюжет

    library(ggplot2)
    ggplot(df, aes(name, value, group = 1)) +
        geom_polygon(fill = "red", colour = "red", alpha = 0.4) +
        geom_point(colour = "red") +
        coord_radar() +
        ylim(0, 10) +
        theme(axis.text.x = element_text(face = df$face))
    

    введите здесь описание изображения

    Обратите внимание, что это дает предупреждение, которое я предпочитаю здесь игнорировать, поскольку мы явно используем векторизованную опцию element_text.

    Предупреждающее сообщение: векторизованный ввод в element_text() официально не поддерживается. Результаты могут быть неожиданными или могут измениться в будущих версиях ggplot2.

person Maurits Evers    schedule 21.06.2020

Мое предложение состояло бы в том, чтобы определить самые высокие значения, которые вы хотите выделить, и поместить их в фрейм данных. Затем используйте geom_richtext(), чтобы выделить.

person YBS    schedule 20.06.2020