4

我需要一种灵活的方法在 ggplot2 中制作雷达/蜘蛛图。从我在 github 和 ggplot2 组上找到的解决方案中,我已经走到了这一步:

library(ggplot2) 

# Define a new coordinate system 
coord_radar <- function(...) { 
  structure(coord_polar(...), class = c("radar", "polar", "coord")) 
} 
is.linear.radar <- function(coord) TRUE 

# rescale all variables to lie between 0 and 1 
scaled <- as.data.frame(lapply(mtcars, ggplot2:::rescale01))

scaled$model <- rownames(mtcars)    # add model names as a variable 

as.data.frame(melt(scaled,id.vars="model")) -> mtcarsm

ggplot(mtcarsm, aes(x = variable, y = value)) + 
    geom_path(aes(group = model)) +
    coord_radar() + facet_wrap(~ model,ncol=4) + 
    theme(strip.text.x = element_text(size = rel(0.8)), 
          axis.text.x = element_text(size = rel(0.8)))

这有效,除了线没有关闭的事实。我认为我能够做到这一点:

mtcarsm <- rbind(mtcarsm,subset(mtcarsm,variable == names(scaled)[1]))
ggplot(mtcarsm, aes(x = variable, y = value)) + 
    geom_path(aes(group = model)) +
    coord_radar() + facet_wrap(~ model,ncol=4) + 
    theme(strip.text.x = element_text(size = rel(0.8)), 
          axis.text.x = element_text(size = rel(0.8)))

为了加入行,但这不起作用。这也不是:

closes <- subset(mtcarsm,variable == names(scaled)[c(1,11)])
ggplot(mtcarsm, aes(x = variable, y = value)) + 
    geom_path(aes(group = model)) +
    coord_radar() + facet_wrap(~ model,ncol=4) + 
    theme(strip.text.x = element_text(size = rel(0.8)), 
          axis.text.x = element_text(size = rel(0.8))) + geom_path(data=closes)

这并不能解决问题,而且还会产生很多

“geom_path:每个组只包含一个观察值。你需要调整组审美吗?”

消息。索姆,我该如何关闭线路?

/弗雷德里克

4

6 回答 6

4

ggproto使用ggplot2 2.0.0 中可用的新机制,coord_radar可以定义为:

coord_radar <- function (theta = "x", start = 0, direction = 1) 
{
 theta <- match.arg(theta, c("x", "y"))
 r <- if (theta == "x") 
        "y"
      else "x"
 ggproto("CoordRadar", CoordPolar, theta = theta, r = r, start = start, 
      direction = sign(direction),
      is_linear = function(coord) TRUE)
}

不确定语法是否完美,但它正在工作......

于 2015-12-30T10:13:11.410 回答
3

这里的代码对于 ggplot2: 2.0.0 来说似乎已经过时了

试试我的包 zmisc:devtools:install_github("jerryzhujian9/ezmisc")

安装后,您将能够运行:

df = mtcars
df$model = rownames(mtcars)

ez.radarmap(df, "model", stats="mean", lwd=1, angle=0, fontsize=0.6, facet=T, facetfontsize=1, color=id, linetype=NULL)
ez.radarmap(df, "model", stats="none", lwd=1, angle=0, fontsize=1.5, facet=F, facetfontsize=1, color=id, linetype=NULL)

如果您对里面的内容感到好奇,请在github 上查看我的代码:

主要代码改编自http://www.cmap.polytechnique.fr/~lepennec/R/Radar/RadarAndParallelPlots.html

在此处输入图像描述 在此处输入图像描述

于 2016-02-15T03:51:02.320 回答
3
  • 解决方案关键因素
    1. 在by之后添加重复的mpgmeltrbind
    2. 继承CoordPolar_ggproto
    3. 开始is_linear = function() TRUE_ggproto

尤其is_linear = function() TRUE重要,
因为如果不是这样,您将得到这样的情节...

在此处输入图像描述

使用is_linear = function() TRUE您可以获得的设置,

在此处输入图像描述

library(dplyr)
library(data.table)
library(ggplot2)

rm(list=ls())

scale_zero_to_one <- 
  function(x) {
    r <- range(x, na.rm = TRUE)
    min <- r[1]
    max <- r[2]
    (x - min) / (max - min)
  }

scaled.data <-
  mtcars %>%
  lapply(scale_zero_to_one) %>%
  as.data.frame %>%
  mutate(car.name=rownames(mtcars)) 

plot.data <-
  scaled.data %>%
  melt(id.vars='car.name') %>%
  rbind(subset(., variable == names(scaled.data)[1]))

# create new coord : inherit coord_polar
coord_radar <- 
  function(theta='x', start=0, direction=1){
    # input parameter sanity check
    match.arg(theta, c('x','y'))

    ggproto(
      NULL, CoordPolar, 
      theta=theta, r=ifelse(theta=='x','y','x'),
      start=start, direction=sign(direction),
      is_linear=function() TRUE)
  }

plot.data %>%
  ggplot(aes(x=variable, y=value, group=car.name, colour=car.name)) + 
  geom_path() +
  geom_point(size=rel(0.9)) +
  coord_radar() + 
  facet_wrap(~ car.name, nrow=4) + 
  theme_bw() +
  theme(
    axis.title.y = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    axis.title.x = element_blank(),
    legend.position = 'none') +
  labs(title = "Cars' Status")
  • 最后结果
    在此处输入图像描述
于 2017-12-29T12:20:29.560 回答
1

对不起,我是愚蠢的。这似乎有效:

library(ggplot2) 

# Define a new coordinate system 
coord_radar <- function(...) { 
  structure(coord_polar(...), class = c("radar", "polar", "coord")) 
} 
is.linear.radar <- function(coord) TRUE 

# rescale all variables to lie between 0 and 1 
scaled <- as.data.frame(lapply(mtcars, ggplot2:::rescale01))

scaled$model <- rownames(mtcars)    # add model names as a variable 

as.data.frame(melt(scaled,id.vars="model")) -> mtcarsm


mtcarsm <- rbind(mtcarsm,subset(mtcarsm,variable == names(scaled)[1]))
ggplot(mtcarsm, aes(x = variable, y = value)) + 
    geom_path(aes(group = model)) +
    coord_radar() + facet_wrap(~ model,ncol=4) + 
    theme(strip.text.x = element_text(size = rel(0.8)), 
          axis.text.x = element_text(size = rel(0.8))) 
于 2015-03-09T07:52:36.707 回答
0

事实证明,geom_polygom 仍然在极坐标中生成一个多边形,因此

# rescale all variables to lie between 0 and 1
scaled <- as.data.frame(lapply(mtcars, ggplot2:::rescale01))
scaled$model <- rownames(mtcars)    # add model names as a variable
# melt the dataframe
mtcarsm <- reshape2::melt(scaled)
# plot it as using the polygon geometry in the polar coordinates
ggplot(mtcarsm, aes(x = variable, y = value)) +
geom_polygon(aes(group = model), color = "black", fill = NA, size = 1) +
coord_polar() + facet_wrap( ~ model) +
theme(strip.text.x = element_text(size = rel(0.8)),
    axis.text.x = element_text(size = rel(0.8)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()) +
xlab("") + ylab("")

完美运行...

于 2015-06-01T15:34:06.683 回答
0

谢谢你们的帮助,但它并没有满足我的所有需求。我使用了两个系列的数据进行比较,所以我为马自达选择了 mtcars 的子集:

  1. 没有人提到 x 变量的顺序,而 ggplot2 为绘图对这个变量进行排序,但没有对数据进行排序,这使我的图表在第一次尝试时出错。为我应用排序功能是 dplyr::arrange(plot.data, x.variable.name)

  2. 我需要用值注释图表,并且 ggplot2::annotate() 工作正常,但它没有包含在最近的答案中

  3. 在添加 ggplot2::geom_line 之前,上面的代码对我的数据不起作用

最后这个代码块做了我的图表:

scaled <- as.data.frame(lapply(mtcars, ggplot2:::rescale01))
scaled$model <- rownames(mtcars)
mtcarsm <- scaled %>%
  filter(grepl('Mazda', model)) %>% 
  gather(variable, value, mpg:carb) %>% 
  arrange(variable)


ggplot(mtcarsm, aes(x = variable, y = value)) + 
  geom_polygon(aes(group = model, color = model), fill = NA, size = 1) +
  geom_line(aes(group = model, color = model), size = 1) + 
  annotate("text", x = mtcarsm$variable, y = (mtcarsm$value + 0.05), label = round(mtcarsm$value, 2), size = 3) +
  theme(strip.text.x = element_text(size = rel(0.8)),
        axis.text.x = element_text(size = rel(1.2)),
        axis.ticks.y = element_blank(),
        axis.text.y = element_blank()) +
  xlab("") + ylab("") +
  guides(color = guide_legend()) +
  coord_radar()

希望对某人有用

于 2016-05-24T10:18:51.510 回答