Вопрос по ggplot2, polar-coordinates, r – модифицированный полярный график с использованием ggplots или других альтернативных пакетов с использованием R

3

Я пытаюсь создать хороший (!) Полярный сюжет со следующими данными.

<code>gr1 <- c(0, 5, 15, 20, 30, 40)
gr3 <- c(0, 5, 10, 25, 40, 60, 80)
gr2 <- c(0, 15, 25, 30, 40)

df2<- data.frame (pos = c(gr1, gr2, gr3), group = c(rep(1, length(gr1)),
 rep(2, length(gr1)), rep(2, length(gr1))))



inner circle segment to mark
                   first tier, group 1, between 15, 20
                               group 3, between 5, 10
                                        between  40 to 60 
                   second tier, group 1, between 15, 20
                               group 3, between 5, 10
                                        between 10, 25
                                        between  40 to 60 
</code>

Угол между двумя линиями между промежутком между двумя поз.

в моих реальных данных есть более двух уровней для построения.

Маркерами могут быть либо сегменты, либо другие метки, такие как закрашенные цвета.

Различные группы могут иметь цветовую кодировку, если это возможно.

enter image description here

Альтернатива с круговой маркировкой (предпочтительно)

enter image description here

Я попробовал это с ggplot2.

<code>cx <- ggplot(df2, aes(x = pos, group = group) +   geom_bar(width = 1, colour = "black"))
Error in aes(x = pos, group = group) + geom_bar(width = 1, colour = "black") :
  non-numeric argument to binary operator
cx + coord_polar()
</code>

Больше испытаний:

<code>df2$cpos <- cumsum (df2$pos)
cx <- ggplot(df2, aes(x = cpos, group = group) +   geom_bar(width = 1, colour = "black"))
</code>

Редактирует 1:

Я думаю, что мне было бы ужасно объяснять проблему. Вот фигура с объяснением. enter image description here

Позиция (позиция) - это непрерывная шкала, угол в полярности должен зависеть от того, где находится позиция. Он перезапустится, как только одна группа будет завершена. Я сделал трюк, чтобы кончить на этот трюк (я могу ошибаться).

Редактирует 2:

Следующий ответ открыл больше мыслей в вопросе. Это улучшенная версия, но управление цветом не работает.

<code>df2$cpos <- cumsum (df2$pos)
df2$y <- rep(3, length (df2$cpos))
cx <- ggplot(df2, aes(y = y, x = cpos))
cx + geom_bar(aes(stat = "identity",fill="yellow", colour = "yellow" )) + 
geom_point(aes(color = factor(group)), pch = 18, size = 2) + coord_polar() +
 scale_fill_manual(values=c("#CC6666", "#9999CC", "#66CC99"))+ ylim(0,3)
</code>

enter image description here

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

<code>Error in data$y[data$y == -Inf] <- range$y.range[1] : 
  replacement has length zero
</code>
после вызова ggplot2 возникли несоответствия паренов, вызвавшие ошибку Chase

Ваш Ответ

1   ответ
5

что вы хотите сделать (гистограмма считает частоты, вы, наверное, знаете это). Однако вот способ присвоить группы цветам:

gr1 <- c(0, 5, 15, 20, 30, 40)
gr3 <- c(0, 5, 10, 25, 40, 60, 80)
gr2 <- c(0, 15, 25, 30, 40)

df2<- data.frame (pos = c(gr1, gr2, gr3), group = c(rep(1, length(gr1)),
 rep(2, length(gr2)), rep(3, length(gr3))))
df2$cpos <- cumsum (df2$pos)

cx <- ggplot(df2, aes(fill = factor(group), x = cpos))

cx + geom_bar(width = 1, colour = "black", position = "dodge")  + coord_polar()

enter image description here

Если вы хотите получить pos как частоты, используйтеmelt() функция вreshape2.

Если вы хотите использовать точки, как в вашем примере, может ли следующий подход работать?

cx <- ggplot(df2, aes(y = group, x = cpos))

cx + geom_point(aes(color = factor(group))) + coord_polar() + ylim(0,3)

Во всяком случае, вы видите шаблон? Создайте график с нормальными координатами, используя ось X в качестве угла и ось Y в качестве расстояния от середины, и просто преобразуйте его в полярные координаты.

enter image description here

Answer to Edit2

Мне все еще интересно, могли бы вы сделать сюжет, который имеет больше смысла, но, возможно, у вас есть причина сделать это. Вот сюжет, который ближе к вашему примеру. Это не идеально. Может быть, гуру могут дать вам лучшее предложение завтра, когда они придут в свои офисы. В то же время, вы можете искать больше спецификацийпо ссылкам этого протектора.

library(ggplot2)

gr1 <- c(0, 5, 15, 20, 30, 40)
gr3 <- c(0, 5, 10, 25, 40, 60, 80)
gr2 <- c(0, 15, 25, 30, 40)

df2<- data.frame (pos = c(gr1, gr2, gr3), group = c(rep(1, length(gr1)),
 rep(2, length(gr2)), rep(3, length(gr3))), y  = c(rep(1, length(gr1)),
 rep(2, length(gr1)), rep(2, length(gr1))))

df2$cpos <- cumsum (df2$pos)

cx <- ggplot(df2, aes(y = y, x = cpos))
cx + geom_point(aes(color = factor(group)), size = 4) + geom_line(aes(x = c(0,500), y = c(1)), color = "yellow") + 
geom_line(aes(x = c(0,500), y = c(2)), color = "blue") + scale_y_continuous(limits=c(0,2), breaks = c(0,1,2)) +
scale_x_continuous(labels = df2$pos, breaks = df2$cpos, limits = c(0,500)) + coord_polar() +
opts(panel.grid.major = theme_line(colour = "grey"), 
panel.grid.minor = theme_line(colour = "grey", linetype = "dashed"), 
panel.background = theme_rect(colour = "white"))

enter image description here

да, вы правы, частота не то, что я хочу построить. jon
Второй график кажется более близким, если точки преобразуются в ленту и находятся на одном уровне яруса (на одной окружности самого верхнего круга), спасибо, это даст мне шаг ближе jon
Вы не можете построить несколько шкал по оси X, используя ggplot2. Функции facet_wrap / grid будут составлять отдельные графики. Я думаю, что cpos - правильный подход, если вы хотите использовать ggplot2. Может быть, проще построить это с помощью стандартной команды plot ...
посмотрите мои последние правки jon
пожалуйста, смотрите мои последние изменения, спасибо за ответ jon

Похожие вопросы