【问题标题】:How to change Font Family and position of text on a Pie chart in R如何在 R 中更改饼图上的字体系列和文本位置
【发布时间】:2021-11-21 20:08:42
【问题描述】:

我在 R 中有下面的饼图。
我想: 1-将字体系列更改为 Arial Narrow。 2-将内部图表百分比标签远离中心。 我该怎么做?

另外,如果可能的话,我很想知道 R 选择图例的顺序背后的逻辑是什么?为什么不从最大比例到最小比例呢?

mydf <- data.frame(
causes=c("a", "b", "c", "d", "other"),
freq=c(100, 80, 78, 75, 120),#
share= 100*c(100/sum(freq), 80/sum(freq), 78/sum(freq), 75/sum(freq), 120/sum(freq))
 )
sum(freq)
ggplot(mydf, aes("", share, fill = causes)) +



geom_bar(width = 1, size = 1, color = "white", stat = "identity") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(share), "%")), 
            position = position_stack(vjust = 0.5), size=5, col="white") +
  labs(x = NULL, y = NULL, fill = NULL, 
       title = "leading causes of death in US") +
  guides(fill = guide_legend(reverse = TRUE)) +
  scale_fill_manual(values = c("#003B6D", "#6699CC", "#BDBDBD", "#676767", "#EBEDF3")) +
  theme_classic() +
  theme(axis.line = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    plot.title = element_text(hjust = 0.5, color = "#666666"))

【问题讨论】:

    标签: r ggplot2 plot fonts pie-chart


    【解决方案1】:

    试试这个方法

    mydf$Label  <- round(((mydf$freq/sum(mydf$freq))*100),2)
    mydf <- mydf %>%
      mutate(end = 2 * pi * cumsum(Label)/sum(Label),
             start = lag(end, default = 0),
             middle = 0.5 * (start + end),
             hjust = ifelse(middle > pi, 1, 0),
             vjust = ifelse(middle < pi/2 | middle > 3 * pi/2, 0, 1))
    
    
    ggplot(mydf) + 
      ggforce::geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                       start = start, end = end, fill = causes)) +
      geom_text(aes(x = 1.05 * sin(middle), y = 1.05 * cos(middle), label = Label,
                    hjust = hjust, vjust = vjust)) +
      coord_fixed() +
      labs(x = NULL, y = NULL, fill = NULL, 
           title = "leading causes of death in US") +
      guides(fill = guide_legend(reverse = TRUE)) +
      scale_fill_manual(values = c("#003B6D", "#6699CC", "#BDBDBD", "#676767", "#EBEDF3")) +
      theme_classic() +
      theme(axis.line = element_blank(),
            axis.text = element_blank(),
            axis.ticks = element_blank(),
            plot.title = element_text(hjust = 0.5, color = "#666666"))
    

    内部

    mydf <- mydf %>%
      mutate(end = 2 * pi * cumsum(Label)/sum(Label),
             start = lag(end, default = 0),
             middle = 0.5 * (start + end),
             hjust = ifelse(middle > pi, 0, 1),
             vjust = ifelse(middle < pi/2 | middle > 3 * pi/2, 1, 0))
    
    
    ggplot(mydf) + 
      ggforce::geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                                start = start, end = end, fill = causes)) +
      geom_text(aes(x = 0.95 * sin(middle), y = 0.95 * cos(middle), label = Label,
                    hjust = hjust, vjust = vjust)) +
      coord_fixed() +
      labs(x = NULL, y = NULL, fill = NULL, 
           title = "leading causes of death in US") +
      guides(fill = guide_legend(reverse = TRUE)) +
      scale_fill_manual(values = c("#003B6D", "#6699CC", "#BDBDBD", "#676767", "#EBEDF3")) +
      theme_classic() +
      theme(axis.line = element_blank(),
            axis.text = element_blank(),
            axis.ticks = element_blank(),
            plot.title = element_text(hjust = 0.5, color = "#666666"))
    

    字体

    ggplot(mydf) + 
      ggforce::geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                                start = start, end = end, fill = causes)) +
      geom_text(aes(x = 0.95 * sin(middle), y = 0.95 * cos(middle), label = Label,
                    hjust = hjust, vjust = vjust), fontface = "bold") + #inside chart here
      coord_fixed() +
      labs(x = NULL, y = NULL, fill = NULL, 
           title = "leading causes of death in US") +
      guides(fill = guide_legend(reverse = TRUE)) +
      scale_fill_manual(values = c("#003B6D", "#6699CC", "#BDBDBD", "#676767", "#EBEDF3")) +
      theme_classic() +
      theme(axis.line = element_blank(),
            axis.text = element_blank(),
            axis.ticks = element_blank(),
            plot.title = element_text(hjust = 0.5, color = "#666666"),
            text = element_text(family = "sans")) #title here
    

    对于fontface,可以使用“plain”、“bold”、“italic”、“bold.italic”,对于element_text(family),可以使用单声道

    sans
    serif
    Courier
    Helvetica
    Times
    AvantGarde
    Bookman
    Helvetica-Narrow
    NewCenturySchoolbook
    Palatino
    URWGothic
    URWBookman
    NimbusMon
    URWHelvetica
    NimbusSan
    NimbusSanCond
    CenturySch
    URWPalladio
    URWTimes
    NimbusRom
    

    可用。

    【讨论】:

    • 谢谢你。我一直在玩你建议的东西,也许能得到我想要的东西。我注意到将 hjust = ifelse(middle > pi, 1, 0) 更改为 hjust = ifelse(middle > pi, -2, 0),使标签 26.49 向内移动但接近圆的圆周(我想要的所有标签 )。但是我怎样才能将所有标签移到里面但靠近圆周。
    • @Mathica 好吧,最好将ifelse 语句翻转为hjustvjust。然后,将乘以文本位置的系数从1.05 更改为0.95 将在里面制作标签。我在上面添加代码和绘图。
    • 完美!谢谢。你知道在 ggplot 中更改饼图标签的字体系列吗?
    • @Mathica 真的很抱歉。我完全忘记了字体问题。我在上面添加了关于字体的参数。请检查一下。
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多