Geeker_odd 发表于 2021-11-21 12:27:41

问题出在哪里?

请教python数据分析高手,这段代码错在哪里?:

import matplotlib.pyplot as plt
labels='蛋白质','碳水','脂肪','维生素'
sizes=
explode=(0,0.1,0,0)
plt.pie(sizes,labels,explode=explode,autopct='%1.1f%%',shadow='True',startangle=90)
plt.show()

运行后一直提醒如下错误:

File "<ipython-input-8-13771d9d2244>", line 5, in <module>
    plt.pie(sizes,labels,explode=explode,autopct='%1.1f%%',shadow='True',startangle=90)

TypeError: pie() got multiple values for argument 'explode'

suchocolate 发表于 2021-11-21 12:38:01

官网说除了x都是关键字参数,所以labels得加关键字。
import matplotlib.pyplot as plt
import matplotlib as mpl


mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False


labels = '蛋白质', '碳水', '脂肪', '维生素'
sizes =
explode = (0, 0.1, 0, 0)
plt.pie(sizes, labels=labels, explode=explode, autopct='%1.1f%%', shadow='True', startangle=90)
plt.show()

https://matplotlib.org/3.3.1/api/_as_gen/matplotlib.pyplot.pie.html?highlight=plot%20pie#matplotlib.pyplot.pie

Geeker_odd 发表于 2021-11-21 14:15:55

错误的提示是:参数explode得到多个值。

你的代码和我的一样啊,我复制了去spider运行,出现一样的错误提示。

Geeker_odd 发表于 2021-11-21 14:18:37

哦,不是,是我错了。二楼的代码是对的!谢谢!

Geeker_odd 发表于 2021-11-21 14:19:18

但是,我没搞懂为什么........

阿奇_o 发表于 2021-11-21 15:19:46

本帖最后由 阿奇_o 于 2021-11-21 15:26 编辑

Geeker_odd 发表于 2021-11-21 14:19
但是,我没搞懂为什么........

原理是"位置参数"与"关键字参数"的区别:
当你没写形参labels时,就是位置参数的写法,这时 第二个位置的位置参数 其实是explode,而不是你以为的labels,
而你传入的是labels这个实参(含了多个值),但位置参数explode 要接收的是 一个包含分数的 类数组的实参对象(如列表,元组等),
所以报错:参数explode接收到了多个值,也就是它接收到了 labels指向的多个值,这并不是它需要的。
后面的参数就根本不接收了(第二个位置的参数已经出错了,就停止处理后面的了)

根据这个原理,下面几种写法都可以:
plt.pie(sizes, labels=labels, explode=explode, autopct='%1.1f%%', shadow='True', startangle=90)
plt.pie(sizes, explode, labels=labels, autopct='%1.1f%%', shadow='True', startangle=90)
plt.pie(sizes, explode, labels, autopct='%1.1f%%', shadow='True', startangle=90)


suchocolate 发表于 2021-11-21 15:19:48

Geeker_odd 发表于 2021-11-21 14:19
但是,我没搞懂为什么........

看官网说明里的参数: matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
第一个x,就是x轴,explode就是y的数据,labels是label,除x外都是关键字参数。
在你的旧代码里是这样写的,plt.pie(sizes,labels,explode=explode,autopct='%1.1f%%',shadow='True',startangle=90)
因为你传参没有写明关键字,labels默认就赋值给了explode,所以有报错。这个是函数传参基础。

Geeker_odd 发表于 2021-11-23 11:51:36

非常感谢两位!

18408238295 发表于 2021-11-23 20:18:02

{:10_256:}
页: [1]
查看完整版本: 问题出在哪里?