在R中制作带百分比标签饼图时遇legend函数报错的排查
饼图报错:
Error in edges * dx[i] : non-numeric argument to binary operator 解决方法 问题描述
尝试在R中制作带百分比标签的饼图,运行代码时触发上述错误,注释掉legend()函数后则无报错,原代码如下:
df <- data.frame( geeks = c(23, 56, 20, 63), labels = c("Mumbai", "Pune", "Chennai", "Bangalore")) df <- mutate(df, percent = round(df$geeks/sum(df$geeks)*100, 1)) df_pie <- pie(df$geeks, round(df$percent,1), main = "City pie chart", col = rainbow(length(df$geeks)), legend("topright", c(df$labels), cex = 0.5, fill = rainbow(length(df$geeks))))
错误原因
你错误地将legend()函数直接作为pie()的参数传入了。pie()函数的参数列表里没有接受legend的位置参数,当你把legend()的调用放在pie()的参数中时,pie()会把这个函数调用的结果(无返回值,即NULL)当作数值参数处理,从而触发"非数值参数参与二元运算"的错误。
修正后的代码
需要将pie()和legend()分开调用,先绘制饼图,再单独添加图例:
library(dplyr) # 加载dplyr包,因为用到了mutate函数 df <- data.frame( geeks = c(23, 56, 20, 63), labels = c("Mumbai", "Pune", "Chennai", "Bangalore")) df <- mutate(df, percent = round(df$geeks/sum(df$geeks)*100, 1)) # 先绘制饼图,指定百分比标签 pie(df$geeks, labels = paste(df$percent, "%", sep = ""), # 格式化百分比标签,显示更直观 main = "City pie chart", col = rainbow(length(df$geeks))) # 单独调用legend添加图例 legend("topright", df$labels, cex = 0.5, fill = rainbow(length(df$geeks)))
补充说明
- 必须加载
dplyr包,否则mutate函数会报错无法找到 - 饼图的
labels参数可以直接指定为格式化后的百分比字符串,提升图表可读性
内容的提问来源于stack exchange,提问作者SepiaHippo
相关产品推荐
相关产品推荐

