代码之家  ›  专栏  ›  技术社区  ›  Let's Yo

如何将标签放在piechart之外?

  •  11
  • Let's Yo  · 技术社区  · 8 年前

    如何将标签放在饼图之外,以便标签位于正确的位置?

    Product <- c("Product1","Product2","Product3","Product4","Product5","Product6","Product7")
    Value <- c(1000000,200002,599996,1399994,2199992,2999990,3799988)
    df <- data.frame(Product,Value)
    df$Label <- paste(Product, paste(round(((df$Value/sum(df$Value))*100),2),"%"), sep="-")
    
    library(ggplot2)
    
    p <-  ggplot(df, aes(x = 1, y = Value, fill = Product)) + geom_bar(stat = "identity")
    p <- p + coord_polar(theta = 'y') + theme_void()
    p <- p + geom_text(aes(label = Label), position = position_stack(vjust = 0.5))
    

    enter image description here

    3 回复  |  直到 8 年前
        1
  •  20
  •   Jaap    5 年前

    使用:

    library(dplyr)
    df <- df %>% 
      mutate(end = 2 * pi * cumsum(Value)/sum(Value),
             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))
    
    library(ggforce) # for 'geom_arc_bar'
    ggplot(df) + 
      geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                       start = start, end = end, fill = Product)) +
      geom_text(aes(x = 1.05 * sin(middle), y = 1.05 * cos(middle), label = Label,
                    hjust = hjust, vjust = vjust)) +
      coord_fixed() +
      scale_x_continuous(limits = c(-1.5, 1.5),  # Adjust so labels are not cut off
                         name = "", breaks = NULL, labels = NULL) +
      scale_y_continuous(limits = c(-1, 1.1),    # Adjust so labels are not cut off
                         name = "", breaks = NULL, labels = NULL)
    

    给予:

    enter image description here

        2
  •  3
  •   parth    8 年前

    除了通过@Jaap解决外,还可以通过添加 theme scale_y_continuous 到您的基本绘图 p .

    p <- ggplot(df,aes(x=1,y=Value,fill=Product))+geom_bar(stat="identity", color = "black")
    
    p <- p + coord_polar(theta='y')+ theme(axis.ticks=element_blank(),
                                           axis.text.y=element_blank(),
                                           axis.text.x=element_text(colour='black'),
                                           axis.title=element_blank())
    p <- p + scale_y_continuous(breaks=cumsum(df$Value) - df$Value / 2, labels= df$Label)
    

    结果如下: pe-plot

        3
  •  2
  •   Ibis_Q    5 年前

    我试图在@Jaap的代码中包含产品1的标签。我在geom\u文本中更改了x和y值,结果成功了。代码中的其他所有内容都是相同的。

    geom_text(aes(x = 1 * sin(middle), y = 1 * cos(middle), label = Label,
                hjust = hjust, vjust = vjust))
    
    推荐文章