【问题标题】:Tidying up the ggplot pie chart整理ggplot饼图
【发布时间】:2020-06-26 23:46:54
【问题描述】:

在这里查看各种帖子并提出问题后,我已经能够制作一个多方面的饼图。但是我在整理饼图时遇到了问题。以下是我遇到的麻烦:

  1. 如何从每一行中删除分面标签,并且在顶部或底部以及左侧或右侧只有一个分面标签?如何控制构面标签的外观?
  • 我尝试使用facet_grid 代替facet_wrap 并从每一行中删除标签,但标签仍位于框内。我想移除我似乎无法做到的盒子。
  1. 使标签居中,以便饼图的每个部分的值都在该饼图切片内。 我的一些饼图有 8 到 10 个值,它们并不总是在小数之内。首先我使用了geom_text_repel,但这只会帮助我击退文本。它没有将文本放在每个分数内。我还查看了this 线程。我尝试通过创建一个具有位置值的新数据框并在geom_text 中使用pos 就像d<-c %>% group_by(Parameter)%>% mutate(pos= ave(Values, Zones, FUN = function(x) cumsum(x) - 0.5 * x)) 一样,并使用相同的代码为d 数据框制作饼图,但它不太有效。李>
  2. 将某个级别下的值分组到一个“其他”组中,这样切片的数量会更少 对我来说,能够将小于 1% 的值分组到一个组中并将其称为“其他”,这样切片的数量就会减少,这将是理想的。到目前为止,我必须完全忽略 c<-c[c$Values>1,] 的这些值,并使用这个新创建的数据框。

有关这些问题的任何建议/帮助都会有所帮助。 以下是我当前饼图的可重现示例:

库(RColorBrewer)
图书馆(ggrepel)
图书馆(ggplot2)
图书馆(tidyverse)
my_pal %
  group_by(区域)%>%
  mutate(per_er=signif((`Erosion_t`/sum(`Erosion_t`))*100,3), per_area=signif((`area..sq.m.`/sum(`area..sq.m.` ))*100,3))

## 重新排列数据:

a
    

【问题讨论】:

  • 当我尝试运行您的示例时,它对我不起作用。无论如何,如果您愿意接受其他选择:varianceexplained.org/r/improving-pie-chart
  • @jared_mamrot 我忘了在代码中包含两个库。包含库后,我尝试在不同的计算机上运行它,它对我有用吗?我希望你有 Rcolorbrewer 库。
  • 一切都好。感谢您修复示例 - 当您让人们轻松帮助您时,它肯定会帮助您获得解决问题的机会。

标签: r ggplot2 pie-chart


【解决方案1】:

如果您对替代方案持开放态度,也许 facet_wrapped 条形图会满足您的需求,例如

library(RColorBrewer)
library(ggrepel)
library(tidyverse)

my_pal <- colorRampPalette(brewer.pal(9, "Set1"))

#### create new matrix ############
new_mat<-matrix(nrow=40, ncol = 4)
colnames(new_mat)<-c("Zones", "ssoilcmb", "Erosion_t", "area..sq.m.")


for ( i in 1:nrow(new_mat)){ 
  new_mat[i,4]<-as.numeric(sample(0:20, 1))
  new_mat[i,3]<-as.numeric(sample(0:20, 1))
  a<-sample(c("S2","S3","S4","S5","S1"),1)
  b<-sample(c("Deep","Moderate","Shallow"),1)
  new_mat[i,1]<-sample(c("High Precip","Moderate Precip","Low Precip"),1)
  
  new_mat[i,2]<-paste0(a,"_",b)
}

m_dt<-as.data.frame(new_mat)
m_dt$Erosion_t<-as.numeric(m_dt$Erosion_t)
m_dt$area..sq.m.<-as.numeric(m_dt$area..sq.m.)

#### calculate parea
m_dt<- m_dt %>%
  group_by(Zones)%>%
  mutate(per_er=signif((`Erosion_t`/sum(`Erosion_t`))*100,3),
         per_area=signif((`area..sq.m.`/sum(`area..sq.m.`))*100,3))

## Rearranging data:

a<-data.frame(m_dt$Zones,m_dt$ssoilcmb, m_dt$per_er)
b<-data.frame(m_dt$Zones,m_dt$ssoilcmb, m_dt$per_area)
c<-data.frame(Zones=m_dt$Zones,ssoilcmb=m_dt$ssoilcmb,
              Parameter=c(rep("Erosion",40),rep("Area",40)),
              Values=c(m_dt$per_er,m_dt$per_area))

### New Plot ###
c$Zones <- factor(c$Zones,levels(c$Zones)[c(2,3,1)])

ggplot(c, aes(x=ssoilcmb, y=Values, fill=ssoilcmb)) + 
  geom_col()+
  facet_wrap(Zones~Parameter, nrow = 3) +
  scale_fill_manual(values=my_pal(15)) +
  labs(x = NULL, fill = NULL, title = "Erosions")+
  theme_minimal() + theme(axis.line = element_blank(),
                          axis.ticks = element_blank(),
                          axis.text.x = element_text(angle = 90,
                                                     hjust = 1,
                                                     vjust = 0.5),
                          plot.title = element_text(hjust = 0.5,
                                                    color = "#666666"))

【讨论】:

  • @jared_mamrot 非常感谢您的建议 :)。在这种情况下,我需要制作一个饼图。但是theme_minimal() 绝对有帮助,因为它摆脱了不必要的盒子。但是问题仍然存在,每个方面都有标签,而我想知道是否有办法控制在哪里放置方面标签(顶部或底部)或(左侧或右侧)。
  • 您可以使用 labeller 控制 facet_wrap 中的标签:ggplot2.tidyverse.org/reference/labellers.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多