2015-03-06 7 views
2

Мне нужен гибкий способ создания диаграмм радаров/пауков в ggplot2. От решений, которые я нашел на GitHub и группы ggplot2, я пришел далеко:Закрытие линий в ракете 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))) 

, который работает, за исключением того, что линии не закрыты, за исключением. я thougth, что я смог бы сделать это:

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: Каждая группа состоит только из одного наблюдения Вы должны настроить группу эстетику.? "

сообщения. Сом, как я могу закрыть линии?

/Fredrik

+1

'ggplot (mtcarsm [mtcarsm $ модель == "Мазерати Бора",], АЕС (х = переменная, у = значение)) + geom_path (AES (группа = модели)) + coord_radar()' закрывает линии здесь. – lukeA

+0

Теперь я в замешательстве. Запуск кода, который вы опубликовали, четко показывает пробел в строке между «mpg» и «carb» для меня. Что здесь происходит? –

+1

Забудьте отметить: закрывает строку для фрейма данных rbind. – lukeA

ответ

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

работает отлично ...

+0

Да, но я думаю, что большинство хотели бы видеть прямые линии между пунктами в сюжете (не бисерные). Мне больше нравится результат решения coord_radar ниже. –

2

Используя новый механизм 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) 
} 

Не уверен, что если синтаксис является совершенным, но он работает ...

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

+0

Ваш пакет добавляет функции по сравнению с предоставленными кодом, на который вы ссылаетесь? Или он предоставляет только ярлык для того же рода сюжетов? – PatrickT

+1

У меня есть другой алгоритм масштабирования и внутренне также преобразовать формат данных в длинный формат, который требуется ggplot2. –

+0

Спасибо, Джерри, приятно знать. – PatrickT

0

Спасибо ребята за помощь, но она не охватывает все мои потребности. Я использовал два ряда данных для сравнения, так что я взял подмножество mtcars для Mazda:

  1. никто не упоминал о порядке переменных х и ggplot2 рода этого переменный для сюжета, но не сортирует данные и его сделало мою диаграмму неправильной с первой попытки. Примените функцию сортировки для меня, это было dplyr :: arr (plot.data, x.variable.name)

  2. мне нужно аннотировать диаграмму со значениями и ggplot2 :: аннотирования() отлично работает, но он не был включен в последние ответы

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

Надеюсь, полезно для кого-то

0
  • решение ключевой фактор
    1. добавить дублируется mpg строку после melt по rbind
    2. наследуют CoordPolar на ggproto
    3. установить is_linear = function() TRUE на 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