R 如何使用极坐标在ggplot中绘制雷达图?

R 如何使用极坐标在ggplot中绘制雷达图?,r,ggplot2,radar-chart,R,Ggplot2,Radar Chart,我试图使用ggplot绘制雷达图,遵循图形语法的指导原则。我知道这个软件包,但根据语法,它看起来应该足够了。这是语法中的伪代码: 因此,我认为这样做可能有效,然而,面积图的轮廓是弯曲的,就像我使用了geom_line: library(tidyverse) dd <- tibble(category = c('A', 'B', 'C'), value = c(2, 7, 4)) ggplot(dd, aes(x = category, y = value, group=1)) + c

我试图使用ggplot绘制雷达图,遵循图形语法的指导原则。我知道这个软件包,但根据语法,它看起来应该足够了。这是语法中的伪代码:

因此,我认为这样做可能有效,然而,面积图的轮廓是弯曲的,就像我使用了
geom_line

library(tidyverse)
dd <- tibble(category = c('A', 'B', 'C'), value = c(2, 7, 4))
ggplot(dd, aes(x = category, y = value, group=1)) +
  coord_polar(theta = 'x') +
  geom_area(color = 'blue', alpha = .00001) +
  geom_point()
库(tidyverse)

ddtl;我们可以写一个函数来解决这个问题

事实上,ggplot使用一种称为非线性坐标系数据咀嚼的过程来绘制直线。它基本上将一条直线分成多个部分,并对各个部分应用坐标变换,而不仅仅是直线的起点和终点

如果我们查看例如
GeomArea$draw\u组的面板绘图代码

    function (data, panel_params, coord, na.rm = FALSE) 
{
    ...other_code...
    positions <- new_data_frame(list(x = c(data$x, rev(data$x)), 
        y = c(data$ymax, rev(data$ymin)), id = c(ids, rev(ids))))
    munched <- coord_munch(coord, positions, panel_params)
    ggname("geom_ribbon", polygonGrob(munched$x, munched$y, id = munched$id, 
        default.units = "native", gp = gpar(fill = alpha(aes$fill, 
            aes$alpha), col = aes$colour, lwd = aes$size * .pt, 
            lty = aes$linetype)))
}
我们发现我前面提到的逻辑,非线性坐标系将直线分成许多部分,这是由
ggplot2:::munch_data
处理的

在我看来,我们可以通过某种方式将
coord$is_linear()
的输出设置为始终为真,从而将ggplot变为转换直线

幸运的是,如果我们只重写
is_linear()
函数以返回
TRUE
,我们就不必通过做一些基于ggproto的深层次的事情来弄脏手了:

# Almost identical to coord_polar()
coord_straightpolar <- function(theta = 'x', start = 0, direction = 1, clip = "on") {
  theta <- match.arg(theta, c("x", "y"))
  r <- if (theta == "x") 
    "y"
  else "x"
  ggproto(NULL, CoordPolar, theta = theta, r = r, start = start,
          direction = sign(direction), clip = clip,
          # This is the different bit
          is_linear = function(){TRUE})
}

公平地说,我不知道这一变化的意外后果是什么。至少现在我们知道了ggplot为什么会这样,我们可以做些什么来避免它

编辑:不幸的是,我不知道一种简单/优雅的方法来连接跨轴限制的点,但您可以尝试以下代码:

# Refactoring the data
dd <- data.frame(category = c(1,2,3,4), value = c(2, 7, 4, 2))

ggplot(dd, aes(x = category, y = value, group=1)) +
  coord_straightpolar(theta = 'x') +
  geom_path(color = 'blue') +
  scale_x_continuous(limits = c(1,4), breaks = 1:3, labels = LETTERS[1:3]) +
  scale_y_continuous(limits = c(0, NA)) +
  geom_point()

谢谢你的详细解释。最后要解决的问题是填充C-A之间的区域(即有一条直线连接这些点)。这是否回答了您的问题?
ggplot(dd, aes(x = category, y = value, group=1)) +
  coord_straightpolar(theta = 'x') +
  geom_area(color = 'blue', alpha = .00001) +
  geom_point()
# Refactoring the data
dd <- data.frame(category = c(1,2,3,4), value = c(2, 7, 4, 2))

ggplot(dd, aes(x = category, y = value, group=1)) +
  coord_straightpolar(theta = 'x') +
  geom_path(color = 'blue') +
  scale_x_continuous(limits = c(1,4), breaks = 1:3, labels = LETTERS[1:3]) +
  scale_y_continuous(limits = c(0, NA)) +
  geom_point()
ggplot(dd, aes(x = category, y = value, group=1)) +
  coord_straightpolar(theta = 'x') +
  geom_polygon(color = 'blue', alpha = 0.0001) +
  scale_y_continuous(limits = c(0, NA)) +
  geom_point()