ggRadar 突出显示雷达中的最高值

ggRadar highlight top values in radar

大家好,我正在绘制雷达图,我想突出显示因子或水平中的两个最高值。这种情况下的亮点是使顶部树值的文本加粗

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

一个例子可以是这样的

谢谢

我的建议是确定您希望突出显示的最高值,并将它们放入数据框中。然后用geom_richtext()高亮。

以下是如何在雷达图中突出显示特定类别的分步示例。我真的不明白所有这些额外依赖项(ggRadar 等)的意义,因为直接使用极坐标在 ggplot2 中绘制雷达图非常简单。

  1. 首先,让我们生成一些样本数据。根据 OPs 评论和他基于 iris 数据集的示例,我们 select 每个变量的最大值(来自 Sepal.LengthSepal.WidthPetal.LengthPetal.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,即前 3 个变量的 "bold"(按递减 value 排名),否则 "plain" .我们还需要确保类别的 factor 级别按行号排序(否则 nameface 以后不一定匹配)。

    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 选项。

    Warning message: Vectorized input to element_text() is not officially supported. Results may be unexpected or may change in future versions of ggplot2.