2012-11-17 3 views
4

Я хочу нарисовать диаграмму розы некоторых круговых данных. Я использую пакет circular, и в этом пакете он позволяет нарисовать простую диаграмму розы с помощью функции: rose.diag. Хотя это рисует диаграмму, я хочу усовершенствовать сюжеты, но я не могу найти, чтобы добавить к сюжету или немного настроить его. Я просмотрел его в ggplot2, но мне это не кажется ясным, и я изо всех сил пытаюсь найти еще один пакет в R, который рисует диаграммы розы, подобные этому. Если кто-то может помочь с этим, я был бы признателен услышать ваши ответы.Роза диаграмма в R

я выкладываю образец данных и мой текущий код ниже вместе с моими запросами:

Angle 
0.65454759 
0.01355458 
0.5052027 
0.2264302 
-0.350552 
-0.428481 
0.1231778 
0.258787 
0.06723504 
0.06906181 
2.54608572 
-1.6591672 
3.00437314 
-0.0503291 
-0.828578 
-1.9616418 
-0.6468774 
0.01438686 
0.1162713 
0.9938797 
0.1861583 
0.1547071 
0.2577813 
0.5110576 
0.08714113 

Эти данные являются Радиан углы поворота. Используя circular пакет я делаю эти данные вектора класса circular:

x <- circular(Angle) 

Затем нарисуйте схему розы, используя следующий код, где он вычерчивает диаграмму в градусах и не радианы:

rose.diag(x, pch = 16, cex = 1, axes = TRUE, shrink = 1, col=3, prop = 2, 
    bins=36, upper=TRUE, ticks=TRUE, units="degrees") 

Есть 3 вещи, которые я хотел бы добавить к этому участку:

  1. Измените ориентацию участка так, чтобы 0 был сверху, а не справа.
  2. Добавьте концентрические круги в сюжет, чтобы помочь с визуальной интерпретацией размера и веса каждого из «бункеров».
  3. Добавить строку, чтобы определить средний угол (с погрешностями сд, если это возможно)

ответ

3

Есть несколько способов сделать это. В этом пакете есть аргумент «0» для rose.diag.

y <- scan() # paste in the values from the question and hit return twice 
y <- circlar(y) # not necessary but prevents a warning 
rose.diag(y, units = 'degrees', zero = pi/2) # units doesn't change the underlying units 

В качестве альтернативы вы могли бы установить свойства circular объекта, который вы создали.

y <- circlar(y, zero = pi/2) 
rose.diag(y, units = 'degrees') # note, no 0 call here 

Итак, теперь сюжет поворачивается ... как добавить материал ...

> par('usr') 
[1] -1.376553 1.376553 -1.123200 1.123200 

Это дает мне координаты пользователя и говорит мне размеры сюжета в пространстве пользователя. Теперь я могу делать такие вещи, как добавление круга.

symbols(0, 0, circle = 0.2, inches = FALSE, add = TRUE, fg = 'red') 

Существует lines.circular функции, но это не было очевидно для меня, как использовать его. Я мог бы также построить линию, используя команды segments или arrows и нарисовать прямо на участке с ними. Для преобразования угла и длины линии в точки требуется немного евклидовой геометрии. Это должно начаться.

m <- mean.circle(y) 
segments(0, 0, cos(m+pi/2), sin(m+pi/2), col = 'red') # note I need to add the new 0 position... there is a lines.circular function but it wasn't obvious to me how to use it. 

(наконечник ... обрамление круг в rose.diag находится в радиусе 1 так, что дает в circle аргумент в symbols будет опираться именно на тот момент)

+0

Это здорово, спасибо. Я не понял, что есть «нулевой» аргумент. Есть еще два вопроса: возможно ли рисовать оси x и y (присоединение от 0 до 180 и от 90 до 270)?Также есть ли у вас какие-либо идеи о том, как добавить круговые полосы ошибок в среднюю строку? – James

+0

Команда сегментов может рисовать любую прямую линию. Вам нужно выяснить уравнение для вашей кривой идеи. Вы определяете начальную и конечную точки в терминах углов, а затем просто вычисляете на основе угла и радиуса ряд эвклидовых точек. Итак, если угол идет от 2-3, то просто вычислите 20 точек в этом диапазоне углов. Используйте сегменты, чтобы затем нарисовать все маленькие линии. – John

+0

Хорошо, отлично. Спасибо за вашу помощь в этом. – James

Смежные вопросы