ggRadar выделяет самые высокие значения на радаре - PullRequest
0 голосов
/ 19 июня 2020

Всем привет! Я делаю радарный график и хочу выделить два самых высоких значения в факторах или уровнях. Выделение в этом случае - выделить жирным шрифтом текст верхних значений дерева

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)))

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

image

спасибо

Ответы [ 2 ]

1 голос
/ 22 июня 2020

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

  1. Во-первых, давайте сгенерируем образцы данных. Согласно комментариям OP и его примеру, основанному на наборе данных 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 (спасибо this post ), который сосредоточен вокруг 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.

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

0 голосов
/ 20 июня 2020

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

...