关闭ggplot2雷达/蜘蛛图表中的线条

时间:2015-03-06 11:47:54

标签: r ggplot2 radar-chart aesthetics

我需要一种灵活的方法来制作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:每组只包含一个观察。你需要吗?   调整群体审美?“

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

/弗雷德里克

6 个答案:

答案 0 :(得分:3)

使用ggplot2 2.0.0中提供的新ggproto机制,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)
}

不确定语法是否完美但是有效...

答案 1 :(得分: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

enter image description here enter image description here

答案 2 :(得分:2)

对不起,我是个傻瓜。这似乎有效:

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

答案 3 :(得分:2)

  • 解决方案关键因素
    1. mpg之后添加重复的meltrbind
    2. 继承CoordPolar
    3. 上的ggproto
    4. is_linear = function() TRUE
    5. 上设置ggproto

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

enter image description here

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

enter image description here

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")
  • 最终结果
    enter image description here

答案 4 :(得分: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("")

完美运作......

答案 5 :(得分:0)

谢谢大家的帮助,但它并未涵盖我的所有需求。我使用了两个系列的数据进行比较,因此我将mtcars的子集用于Mazda:

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

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

  3. 在添加ggplot2 :: geom_line

  4. 之前,上述代码对我的数据无效

    最后,这个代码块完成了我的图表:

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

    希望对某人有用