Я потратил несколько дней на эту проблему, и в итоге я решил собрать мой собственный пакет поверх ggradar
.Ядром его является улучшенная версия функции @Tony M.:
CalculateGroupPath4 <- function(df) {
angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(df)-1)) # find increment
xx<-c(rbind(t(plot.data.offset[,-1])*sin(angles[-ncol(df)]),
t(plot.data.offset[,2])*sin(angles[1])))
yy<-c(rbind(t(plot.data.offset[,-1])*cos(angles[-ncol(df)]),
t(plot.data.offset[,2])*cos(angles[1])))
graphData<-data.frame(group=rep(df[,1],each=ncol(df)),x=(xx),y=(yy))
return(graphData)
}
CalculateGroupPath5 <- function(mydf) {
df<-cbind(mydf[,-1],mydf[,2])
myvec<-c(t(df))
angles = seq(from=0, to=2*pi, by=(2*pi)/(ncol(df)-1)) # find increment
xx<-myvec*sin(rep(c(angles[-ncol(df)],angles[1]),nrow(df)))
yy<-myvec*cos(rep(c(angles[-ncol(df)],angles[1]),nrow(df)))
graphData<-data.frame(group=rep(mydf[,1],each=ncol(mydf)),x=(xx),y=(yy))
return(graphData)
}
microbenchmark::microbenchmark(CalculateGroupPath(plot.data.offset),
CalculateGroupPath4(plot.data.offset),
CalculateGroupPath5(plot.data.offset), times=1000L)
Unit: microseconds
expr min lq mean median uq max neval
CalculateGroupPath(plot.data.offset) 20768.163 21636.8715 23125.1762 22394.1955 23946.5875 86926.97 1000
CalculateGroupPath4(plot.data.offset) 550.148 614.7620 707.2645 650.2490 687.5815 15756.53 1000
CalculateGroupPath5(plot.data.offset) 577.634 650.0435 738.7701 684.0945 726.9660 11228.58 1000
Обратите внимание, что я фактически сравнил больше функций в этом тесте - среди других функций от ggradar
.В общем, решение @Tony M хорошо написано - в смысле логики и того, что вы можете использовать его во многих других языках, например, в Javascript, с несколькими изменениями.Однако R
становится намного быстрее, если вы векторизуете операции.Поэтому огромный выигрыш во времени вычислений с моим решением.
Все ответы, кроме @Tony M.'s, использовали coord_polar
-функцию от ggplot2
.Нахождение в декартовой системе координат дает четыре преимущества:
- Это позволяет переносить решение и в другие пакеты печати, например,
plotly
. - Каждый, кто имеет некоторое представление о стандартной косинус и синус-функции, может понять, как работает преобразование данных.
- Вы можете расширять и настраивать график так, как вы хотите - черт, вы можете использовать его с любым пакетом печати, доступным в R!
- Вам не нужно загружать любой кроме вашего картографического пакета.Однако в большинстве случаев имеет смысл перемасштабировать ваши данные, например, с помощью
scales
-пакета Хэдли.
![One possible implementation](https://i.stack.imgur.com/E8pQJ.png)
Если вы, как и я, ничего не знаете о том, как создавать радиолокационные диаграммы, когда вы находите эту тему : The coord_polar()
может создать красивые радарные графики.Однако реализация несколько сложна.Когда я попробовал это, у меня было несколько проблем:
- Первая проблема с этим подходом - то, что линии не остаются прямыми.
- Например,
coord_polar()
не преобразуется в график. - Полярная система координат усложняет детальную настройку, поскольку аннотации и другие объекты также будут добавлены в полярные координаты.
Этот парень сделал хорошую радиолокационную карту , используя coord_polar
.
Однако, учитывая мой опыт - я скорее советую не использовать coord_polar()
-трюк.Вместо этого, если вы ищете «простой способ» создания статического ggplot-radar, возможно, используйте отличный пакет ggforce
для рисования кругов радара.Нет никаких гарантий, что это проще, чем использовать мой пакет, но от адаптивности кажется аккуратнее, чем coord_polar
.Недостатком здесь является то, что, например, plotly
не поддерживает расширение ggforce.
РЕДАКТИРОВАТЬ: Теперь я нашел хороший пример с ggplot2ordin_polar, который немного изменил мое мнение.