ggplot 饼图中的错误标签
wrong labeling in ggplot pie chart
我正在尝试为百分比值创建一个饼图,当我尝试给它们添加标签时,标签是错误的,
我的意思是这些值在图表中指向了错误的位置。
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()
这是我使用的代码,这是我得到的结果:
当我更改 direction=1
时,图形和标签都会移动
我使用的数据
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)))
对于新用户不确定如何粘贴数据的数据真的很抱歉
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 = 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)
一般解决方案:手动计算堆叠柱的中点
我假设您的目标是在条形的中心点为每个条形放置一个标签。那样的话,首先我们可以计算中心点并将其添加到数据框中:
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
然后 geom_label()
中的 y
美学就是新创建的 "label.point" 列。
我还添加了 labs(x = NULL)
以便在最终情节的 y-axis 上没有空引号。
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(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()
这是我使用的代码,这是我得到的结果:
当我更改 direction=1
时,图形和标签都会移动
我使用的数据
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)))
对于新用户不确定如何粘贴数据的数据真的很抱歉
ggplot 2.0+ 更新
ggplot
2.0+ 为 position_stack()
增加了一些新参数,可以更简单地解决这个问题。无需手动计算每个条形的中心点(尽管在某些情况下该解决方案可能仍然是首选,因此在下面保留)。相反,我们可以简单地使用 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)
一般解决方案:手动计算堆叠柱的中点
我假设您的目标是在条形的中心点为每个条形放置一个标签。那样的话,首先我们可以计算中心点并将其添加到数据框中:
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
然后 geom_label()
中的 y
美学就是新创建的 "label.point" 列。
我还添加了 labs(x = NULL)
以便在最终情节的 y-axis 上没有空引号。
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()