You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:36:23