在 R 中排列 4 个饼图

3 r legend ggplot2 pie-chart plotly

我有四个单独的饼图,它们都具有相同的指定配色方案(除了数据框之外,代码是相同的)。

指定颜色是因为我想将它们在 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)
)
Run Code Online (Sandbox Code Playgroud)

饼图数据

编码:

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   
Run Code Online (Sandbox Code Playgroud)

我已经查看了这些帖子,但无法确定从这些帖子中梳理情节的答案。

在 R Plotly 中部署的子图

以 plotly 绘制多个饼图

我在 ggplot 中寻找类似于 ggarrange 的东西

我有四组数据,其中一些具有相同的组(即相同的行名称)。对于这些,我想使用相同的颜色。

我真的不介意配色方案(即可以是任何颜色),但希望所有 4 个饼图都有一个统一的颜色图例。

vpz*_*vpz 6

嗨@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))

Run Code Online (Sandbox Code Playgroud)

输出:

阴谋

EDIT1: 要为每个饼图显示“字幕”,您可以使用annotations,您还可以更改图例位置。注释的缺点是您必须指定位置(在这种情况下手动)。

为了避免重叠,我建议删除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
                          )
         )
Run Code Online (Sandbox Code Playgroud)

新的输出是: 情节2

EDIT2: 看看fonttext font

您可以使用模板随意更改文本和悬停文本。

这是一个编辑建议去掉标签以获得更多的百分比空间并将百分比四舍五入到 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
                          )
         )
Run Code Online (Sandbox Code Playgroud)

新输出:

情节3