Организуйте 4 круговых графика в R

У меня есть четыре отдельных круговых диаграммы с одинаковой указанной цветовой схемой (код идентичен, за исключением фрейма данных).

Цвета обозначены, потому что я хочу объединить их в 4 сетке с одной легендой, используя одни и те же обозначенные цвета для каждой из 5 групп (то есть, когда цвета не обозначены, цвета автоматически распределяются в зависимости от размера группа).

Пример данных:

# Data
g = c("D","L","X","A","N","B")
v = c(49,14,9,7,6,5)

df1 = data.frame(group = g, value = v)
set.seed(9) # Just for reproductibility
df2 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
                 )

set.seed(8) 
df3 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

set.seed(7)
df4 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

данные круговой диаграммы

Код:

BC <- 

       plot_ly(b_c, labels = ~group, values = ~value, marker = list(colors = c(  '#2ca02c',  '#d62728','#9467bd', '#FF7F0E', '#1F77B4')), type = 'pie',textposition = 'outside',textinfo = 'label+percent') %>%
       layout(title = 'b_c',autosize = F, width = 690, height = 690, margin = m,
              xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
              yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
     BC   

Я просмотрел эти сообщения, но не смог определить ответ для расчесывания сюжетов из них.

Подзаголовки, развертываемые в R Plotly

Графическое построение нескольких круговых диаграмм

Ищу что-то похожее на ggarrange в ggplot

У меня есть четыре набора данных, некоторые из которых имеют одинаковые группы (т. Е. Одинаковые имена строк). Для них я хотел бы использовать тот же цвет.

Я не особо возражаю против цветовой схемы (т.е. может быть любого цвета), но хотел бы иметь объединяющую цветовую легенду для всех 4-х круговых диаграмм.


person Community    schedule 09.01.2020    source источник
comment
Не могли бы вы предоставить данные @sar? И по возможности нарисовать, каким должен быть сюжет и как он выглядит сейчас.   -  person vpz    schedule 29.03.2020
comment
Хммм, я открыл это на другом компьютере и теперь получаю эту ошибку. Указание ширины / высоты в layout () теперь не рекомендуется. Пожалуйста, укажите в ggplotly () или plot_ly ()   -  person    schedule 29.03.2020
comment
@vpz Я добавил пример данных. Я хотел бы расположить 4 круговых диаграммы в квадрате 2x2 с одной легендой, показывающей одинаковые цвета для тех же групп.   -  person    schedule 29.03.2020
comment
Я добавил предложение ответа. Вам это помогает?   -  person vpz    schedule 30.03.2020


Ответы (1)


Привет @sar, посмотрите, решит ли он вашу проблему:

library(plotly)
library(dplyr)

# Data
g = c("D","L","X","A","N","B")
v = c(49,14,9,7,6,5)

df1 = data.frame(group = g, value = v)
set.seed(9) # Just for reproductibility
df2 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
                 )

set.seed(8) 
df3 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)

set.seed(7)
df4 = data.frame(group = sample(g,size = nrow(df1),replace = F),
                 value = sample(v,size = nrow(df1),replace = F)
)


#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group,
        textposition = 'outside',textinfo = 'label+percent') %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

Выход:

сюжет

РЕДАКТИРОВАТЬ1: для отображения «субтитров» для каждого пирога вы можете использовать аннотации , вы также можете изменить положение легенды. Недостатком аннотаций является то, что вы должны указывать позицию (в данном случае - маннуали).

Во избежание дублирования я предлагаю удалить textposition = 'outside'.

Вы можете скачать сюжет в формате .png, нажав кнопку в правом верхнем углу сюжета.

#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group, 
        textinfo = 'label+percent') %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         legend = list(y = 0.5),
         annotations = list(x = c(.08, .62, .08, .62),
                            y = c(.78, .78, .22, .22),
                            text = c("Pie 1","Pie 2","Pie 3","Pie 4"),
                            xref = "papper",
                            yref = "papper",
                            showarrow = F
                          )
         )

Новый вывод:  plot2

РЕДАКТИРОВАТЬ2: посмотрите на шрифт или шрифт текста.

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

Вот редактирование, предлагающее снять ярлыки, чтобы освободить больше места для процентов, и округлить процент до 1 десятичной цифры:

#Plot

plot_ly(labels = ~group, values = ~value, legendgroup = ~group, textinfo = 'label+percent',
        texttemplate = "%{percent:.1%}",
        hovertemplate = "%{label} <br> %{percent:.1%} <br> %{value}") %>%
  add_pie(data = df1, name = "DF1", domain = list(row = 0, column = 0))%>%
  add_pie(data = df2, name = "DF2", domain = list(row = 0, column = 1))%>%
  add_pie(data = df3, name = "DF3", domain = list(row = 1, column = 0))%>%
  add_pie(data = df4, name = "DF4", domain = list(row = 1, column = 1))%>%
  layout(title = "Pie Charts in Grid", showlegend = T,
         grid=list(rows=2, columns=2),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         legend = list(y = 0.5),
         annotations = list(x = c(.08, .62, .08, .62),
                            y = c(.78, .78, .22, .22),
                            text = c("Pie 1","Pie 2","Pie 3","Pie 4"),
                            xref = "papper",
                            yref = "papper",
                            showarrow = F
                          )
         )

Новый результат:

plot3

person vpz    schedule 29.03.2020
comment
это здорово, спасибо. Меня просто интересуют две вещи. Можно ли дать каждому из графиков метку или хотя бы букву (A, B, C, D). Также в моем большом наборе данных у меня есть 20 переменных, некоторые из которых представляют собой крошечные доли пирога, поэтому они перекрываются. Есть ли у вас какие-либо предложения, как не переусердствовать с этими ярлыками? Может быть, поставить * и сноску, в которой перечислены те, на долю которых приходится <1% пирога? - person ; 31.03.2020
comment
также это появляется на вкладке средства просмотра, «показать в следующем окне», есть ли способ сохранить его как .tiff или .png? - person ; 31.03.2020
comment
Привет @sar, я сейчас отредактировал. Я надеюсь это поможет тебе - person vpz; 31.03.2020
comment
Благодарю. Появились ярлыки pie 1,2,3,4. Я все еще испытываю трудности с большим количеством вышележащих небольших групп. Есть идеи, как сгруппировать их как ‹2% и представить в виде сноски? - person ; 31.03.2020
comment
есть ли способ округлить проценты до одной цифры? Я попытался добавить цифры = 1 в первую строку, но это вызвало ошибку. Есть ли способ сделать круговые диаграммы намного больше, а текст - меньше, чтобы избежать наложений? - person ; 31.03.2020
comment
Я действительно не знаю, как делать заметки и пропускать группы с низким процентом. Но вы можете настроить текстовый формат и формат hovertext по своему усмотрению. Взгляните на Edit 2 - person vpz; 31.03.2020
comment
это последнее редактирование значительно улучшило диаграмму, спасибо! Некоторые линии находятся за пределами графика, есть ли способ уместить все графики? Кроме того, есть ли способ изменить текст легенды? - person ; 01.04.2020
comment
Есть ли способ экспортировать в формате PDF или в файл изображения? - person ; 01.04.2020
comment
Привет, @sar. Извините, я не понял, что вы имеете в виду, когда линии не на графике. Не могли бы вы добавить изображение в комментарии? Для легенд положение можно настроить в строках кода legend = list(...). Я полагаю, что вы также можете настроить text font для легенд. - person vpz; 01.04.2020
comment
Привет @vpz. Извините, я имел в виду линии, ведущие к частям пирога. Я попробую эти предложения - person ; 01.04.2020
comment
когда я сохраняю это как png, он становится меньше, и 4 метки пирога перекрывают пироги. Метки круговой диаграммы также начинают перекрываться, и некоторые линии меток уходят за пределы страницы. Есть ли способ сохранить форматирование размера (или указать размер) как файл png? - person ; 02.04.2020
comment
Я пробовал легенду = список (y = 0.5, текст = c (label1, label2, label3)), но, хотя код работал без ошибок, он не изменил метки легенды - person ; 02.04.2020
comment
@sar еще одно решение для сохранения изображения - запустить код на консоли и сгенерировать график на панели Viwer (типично в правой нижней части Rstudio). Затем щелкните Export и сохраните изображение как .PNG. Там вы можете указать размеры вручную. - person vpz; 02.04.2020
comment
Другой подход к изменению меток - создание в каждом data.frame столбца с желаемыми метками. Что-то вроде: df1 = df1 %>% mutate(new_lab = case_when(...)) - person vpz; 02.04.2020
comment
есть ли способ увеличить вертикальное пространство между круговыми диаграммами и нижней частью, чтобы аннотации легенды не обрезались? - person ; 28.04.2020
comment
Когда я увеличиваю размер с помощью grid = list (rows = 2, columns = 2), height = 950, width = 1650, я получаю большой график, но он все равно срезает нижнюю часть. Также я не могу использовать инструмент экспорта, так как он слишком большой, и только 1/4 участка сохранит - person ; 28.04.2020
comment
Вы пробовали увеличивать fig.width и fig.height? - person vpz; 04.05.2020
comment
Я попытался изменить ширину и высоту круговых диаграмм в этой части кода, но это не решило мою проблему перекрытия меток. макет (title = title, showlegend = T, grid = list (rows = 2, columns = 2), height = 800, width = 1200, margin = m, - person ; 10.09.2020
comment
Чтобы ответить на свой вопрос - лучший способ предотвратить перекрытие фигур - это изменить поля m = list (l = 200, r = 200, b = 200, t = 200, pad = 0) - person ; 10.09.2020
comment
ты знаешь, как сделать коробки с легендой больше? Также есть способ выделить список цветов? - person ; 08.10.2020
comment
Возможно, вы можете использовать layout(font = list(...)): plotly.com/r/font - person vpz; 08.10.2020