Добавить круговую ось на круговой график - PullRequest
0 голосов
/ 01 июня 2018

Я бы хотел наложить график с кругами в качестве оси, чтобы проиллюстрировать уровни вероятности (например, 0,25; 0,75, 1).

Для воспроизведения графики вам нужны эти 2 CSV-файла в рабочем каталоге

https://drive.google.com/open?id=1RsleBYQFlm3ce3xuqTLK-_r9s374yd40

Или, поскольку @Gregor любезно посоветовал мне в комментариях, здесь приведены заголовки моих объектов данных, поэтому загрузка не требуется:

dput (head (data))

structure(list(id = 1:6, individual = structure(c(1L, 12L, 23L, 
26L, 27L, 28L), .Label = c("Person 1", "Person 10", "Person 11", 
"Person 12", "Person 13", "Person 14", "Person 15", "Person 16", 
"Person 17", "Person 18", "Person 19", "Person 2", "Person 20", 
"Person 21", "Person 22", "Person 23", "Person 24", "Person 25", 
"Person 26", "Person 27", "Person 28", "Person 29", "Person 3", 
"Person 30", "Person 31", "Person 4", "Person 5", "Person 6", 
"Person 7", "Person 8", "Person 9"), class = "factor"), value = c(0.658333333, 
0.958333333, 0.720833334, 0.883333333, 0.779166667, 0.9375), 
    group = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor")), .Names = c("id", 
"individual", "value", "group"), row.names = c(NA, 6L), class = "data.frame")

и второй объект:

dput (head (label_data)) *

structure(list(id = 1:6, individual = structure(c(1L, 12L, 23L, 
26L, 27L, 28L), .Label = c("Person 1", "Person 10", "Person 11", 
"Person 12", "Person 13", "Person 14", "Person 15", "Person 16", 
"Person 17", "Person 18", "Person 19", "Person 2", "Person 20", 
"Person 21", "Person 22", "Person 23", "Person 24", "Person 25", 
"Person 26", "Person 27", "Person 28", "Person 29", "Person 3", 
"Person 30", "Person 31", "Person 4", "Person 5", "Person 6", 
"Person 7", "Person 8", "Person 9"), class = "factor"), value = c(0.658333333, 
0.958333333, 0.720833334, 0.883333333, 0.779166667, 0.9375), 
    group = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor"), 
    hjust = c(0, 0, 0, 0, 0, 0), angle = c(84.375, 73.125, 61.875, 
    50.625, 39.375, 28.125)), .Names = c("id", "individual", 
"value", "group", "hjust", "angle"), row.names = c(NA, 6L), class = "data.frame")

И затем запуститьследующее:

library(tidyverse)
library(ggplot2)
library(plotrix)



data=read.csv(file="data_object_2.csv", header=TRUE, sep=",")

label_data=read.csv(file="label_data_object_2.csv", header=TRUE, sep=",")


empty_bar=1
to_add = data.frame( matrix(NA, empty_bar*nlevels(data$group), ncol(data)) )
colnames(to_add) = colnames(data)
to_add$group=rep(levels(data$group), each=empty_bar)
data=rbind(data, to_add)
data=data %>% arrange(group)
data$id=seq(1, nrow(data))


number_of_bar=nrow(label_data)
angle= 90 - 360 * (label_data$id-0.5) /32  

label_data$hjust<-ifelse( angle < -90, 1, 0)


label_data$angle<-ifelse(angle < -90, angle+180, angle)

p = ggplot(data, aes(x=as.factor(id), y=value)) +       


  geom_bar(stat="identity", fill=alpha("skyblue", 0.7)) + 


  ylim(-0.3,1) + 
theme_minimal() +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm")     
  ) +


  coord_polar(start = 0) +


  geom_text(data=label_data, aes(x=id, y=value, label=individual, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=2.5, angle= label_data$angle, inherit.aes = FALSE ) +

  geom_vline(xintercept = 0, color = "grey", linetype = "dashed") +  
  annotate("text", label = "p=0", x = 0, y = 0, color = "black") +
  annotate("text", label = "p=1", x = 0, y = 1, color = "black") +
  annotate("text", label = "p=0.5", x = 0, y = 0.5, color = "black") 


p

Это приведет к следующему: https://drive.google.com/open?id=1xDOym_nn-x9nrUoKpB9rtg7h7NYIfucF

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

Я буду очень признателен за любую помощь.

Спасибо, Марек

1 Ответ

0 голосов
/ 03 июня 2018

Вот вариант упрощенной версии вашего кода (я не хотел воссоздавать все метки и т. Д., Только урезанную версию вашего графика).Я думал об этом так: если бы это было в обычных декартовых координатах, вы могли бы показать наложение вероятности, сделав горизонтальную линию, поэтому в полярных координатах эта линия стала бы кругом.Добавление geom_hline дает вам круг в соответствии с yintercept, который вы установили.

Возможно, было бы хорошо обозначить эти вероятности;вы можете выяснить, как лучше всего это сделать в вашем контексте, но я просто сделал пару кругов, установил у-разрыва те же значения и переместил заголовок оси у, чтобы они были рядом с метками, чтобы у них было немногообъяснение.Исходя из вашего контекста, это, возможно, не все необходимо.

Кроме того, я бы порекомендовал объединить эти два фрейма данных в один, чтобы вам было легче отслеживать вещи и не нужно устанавливать разные data = аргументов в разных геометриях.

library(tidyverse)

label_data %>%
  ggplot(aes(x = individual, y = value)) +
    geom_col(width = 0.5, fill = "skyblue", alpha = 0.7) +
    geom_hline(yintercept = c(0.5, 0.75, 0.9), color = "gray60") +
    scale_y_continuous(limits = c(-0.3, NA), breaks = c(0.5, 0.75, 0.9)) +
    theme_minimal() +
    theme(panel.grid = element_blank(), axis.title.y = element_text(hjust = 0.87)) +
    coord_polar(start = 0) +
    labs(x = NULL, y = "Probability")

Создано в 2018-06-03 пакетом Представить (v0.2.0).

...