ggplot饼图错误的标签 [英] wrong labeling in ggplot pie chart

查看:192
本文介绍了ggplot饼图错误的标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图为百分比值创建一个饼图,当我尝试给它们贴上标签是错误的时,



我的意思是这些值指向错误的地方在图中。

$ p $ gcplot(Consumption_building_type,aes(x =,y = percentage,fill = Building_type))+ geom_bar(width = 0.5,stat =identity)+ coord_polar(theta =y,direction = -1)+ geom_text(aes(x = 1.3,y = percent / 3 + c(0,cumsum(percentage)) - )]),label = round(Consumption_building_type $ percentage,0)))+ theme_void()+ scale_fill_brewer(palette =GnBu)+ ggtitle(建筑类型细分)+ theme_minimal()



这是我使用的代码,这是我得到的结果:




当我更改 direction = 1 图表和标签转移时



我使用的数据

 结构(列表(
Building_type = c(商业,工业,机构,大型住宅,
大型住宅,住宅,小型住宅),
Total_consumption_GJ = c(99665694,5970695,10801610,63699633,
16616981,24373766,70488556),
average_consumption_GJ = c(281541.508474576,72813.3536585366,109107.171717172,
677655.670212766,213038.217948718,123099.828282828,640805.054545455),
total = c(354L,82L,99L,94L,78L,198L,110L),
百分比= c(34.8768472906404,8.07881773399015,9.75369458128079
9.26108374384236 7.68472906403941 19.5073891625616 10.8374384236453),
.Names = c(Building_type,Total_consumption_GJ,average_consumption_GJ,total ,百分比),
class = c(tbl_df,tbl,data.frame),row.names = c(NA,-7L)))

真的很抱歉有关新的我们的数据呃不知道如何粘贴数据

解决方案

ggplot 2.0 +的更新



ggplot 2.0+对于 position_stack()有一些新参数,这使得解决这个问题变得简单得多。没有必要手动计算每个柱的中心点(尽管在某些情况下该解决方案仍然可能是首选,因此将保留在下面)。相反,我们可以简单地使用 position_stack()的vjust参数:

  g < -  ggplot(Consumption_building_type,aes(x =,y = percentage,fill = Building_type))+ 
geom_bar(width = 0.5,stat =identity)+
coord_polar (theta =y,direction = 1)+
geom_text(aes(x = 1.3,y = percent,label = round(Consumption_building_type $ percentage,0)),position = position_stack(vjust = 0.5)
scale_fill_brewer(palette =GnBu)+ ggtitle(建筑类型细分)+ theme_minimal()+
实验室(x = NULL)
pre>

一般的解决方案:手动计算堆积条的中点



我假设你的目标是在酒吧的中心点为每个酒吧添加一个标签。在这种情况下,首先我们可以计算中心点并将其添加到数据框中:

  Consumption_building_type $ zone.start< - (Consumption_building_type,c(0,cumsum(百分比)[ -  length(百分比)]))
Consumption_building_type $ zone.end < - with(Consumption_building_type,cumsum(百分比))
Consumption_building_type $ label (消费建筑类型,(zone.start + zone.end)/ 2)

Building_type Total_consumption_GJ average_consumption_GJ总百分比zone.start zone.end label.point
1 Commercial 99665694 281541.51 354 34.87 0.00 34.87 17.435
2工业5970695 72813.35 82 8.07 34.87 42.94 38.905
3机构10801610 109107.17 99 9.75 42.94 52.69 47.815
4大型住宅63699633 677655.67 94 9.26 52.69 61.95 57.320
5大型住宅16616981 213038.22 78 7.68 61.95 69.63 65.790
6住宅24373766 123099.83 198 19.50 69.63 89.13 79.380
7小型住宅70488556 640805.05 110 10.83 89.13 99.96 94.545

然后 geom_label中的 y 审美()就是新创建的label.point列。



我还添加了 labs(x = NULL),这样在最后一幅图的y轴上就没有空的引号。

  new.plot<  -  ggplot(Consumption_building_type,aes(x =,y = percentage,fill = Building_type))+ 
geom_bar(width = 0.5,stat =identity)+
coord_polar(theta =y,direction = 1)+
geom_text(aes(x = 1.3,y = label.point,label = round(Consumption_building_type $ percentage ,0)))+
scale_fill_brewer(palette =GnBu)+ ggtitle(建筑类型细分)+ theme_minimal()


I am trying to create a pie chart for percentage values, when I try to label them the labeling is wrong,

I mean the values are pointing the wrong place in the graph.

ggplot(Consumption_building_type, aes(x="", y=percentage, fill=Building_type))+ geom_bar(width = 0.5,stat ="identity")+coord_polar(theta = "y",direction = -1)+geom_text(aes(x=1.3,y = percentage/3 + c(0, cumsum(percentage)[- length(percentage)]),label = round(Consumption_building_type$percentage,0))) + theme_void()+ scale_fill_brewer(palette="GnBu")+ggtitle("Breakdown of building types")+theme_minimal()

This is the code I used and this is the result I got:


When I change the direction=1 both the graph and the labels shift

the data I used

structure(list(
    Building_type = c("Commercial", "Industrial", "Institutional", "Large residential", 
    "Large Residential", "Residential", "Small residential"), 
    Total_consumption_GJ = c(99665694, 5970695, 10801610, 63699633,
                             16616981, 24373766, 70488556), 
    average_consumption_GJ = c(281541.508474576, 72813.3536585366, 109107.171717172, 
    677655.670212766, 213038.217948718, 123099.828282828, 640805.054545455), 
    total = c(354L, 82L, 99L, 94L, 78L, 198L, 110L), 
    percentage = c(34.8768472906404, 8.07881773399015, 9.75369458128079, 
    9.26108374384236, 7.68472906403941, 19.5073891625616, 10.8374384236453)), 
    .Names = c("Building_type", "Total_consumption_GJ", "average_consumption_GJ", "total", "percentage"), 
     class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -7L)))

Really sorry about the data a new user not sure how to paste the data

解决方案

Update for ggplot 2.0+

ggplot 2.0+ has some new parameters for position_stack() that make solving this problem much simpler. There's no need to calculate the center point of each bar manually (though that solution may still be preferred in some situations and is therefore preserved below). Instead, we can simply use the "vjust" parameter of position_stack():

g <- ggplot(Consumption_building_type, aes(x="", y=percentage, fill=Building_type))+ 
    geom_bar(width = 0.5,stat ="identity")+
    coord_polar(theta = "y",direction = 1)+
    geom_text(aes(x=1.3,y = percentage, label = round(Consumption_building_type$percentage,0)), position = position_stack(vjust = 0.5)) + 
    scale_fill_brewer(palette="GnBu")+ggtitle("Breakdown of building types")+theme_minimal() +
    labs(x = NULL)

General solution: calculating the midpoint of stacked bars manually

I'm assuming that your goal is to place a label for each bar at the bar's center point. In that case, first we can calculate the center point and add it to the data frame:

Consumption_building_type$zone.start <- with(Consumption_building_type, c(0, cumsum(percentage)[-length(percentage)]))  
Consumption_building_type$zone.end <- with(Consumption_building_type, cumsum(percentage))  
Consumption_building_type$label.point <- with(Consumption_building_type, (zone.start + zone.end) / 2) 

      Building_type Total_consumption_GJ average_consumption_GJ total percentage zone.start zone.end label.point
1        Commercial             99665694              281541.51   354      34.87       0.00    34.87      17.435
2        Industrial              5970695               72813.35    82       8.07      34.87    42.94      38.905
3     Institutional             10801610              109107.17    99       9.75      42.94    52.69      47.815
4 Large residential             63699633              677655.67    94       9.26      52.69    61.95      57.320
5 Large Residential             16616981              213038.22    78       7.68      61.95    69.63      65.790
6       Residential             24373766              123099.83   198      19.50      69.63    89.13      79.380
7 Small residential             70488556              640805.05   110      10.83      89.13    99.96      94.545

And then the y aesthetic in geom_label() is simply the newly created "label.point" column.

I've also added labs(x = NULL) so that there are no empty quote marks on the y-axis of the final plot.

new.plot <- ggplot(Consumption_building_type, aes(x="", y=percentage, fill=Building_type))+ 
    geom_bar(width = 0.5,stat ="identity")+
    coord_polar(theta = "y",direction = 1)+
    geom_text(aes(x=1.3,y = label.point, label = round(Consumption_building_type$percentage,0))) + 
    scale_fill_brewer(palette="GnBu")+ggtitle("Breakdown of building types")+theme_minimal()

这篇关于ggplot饼图错误的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆