我在学习用Python绘制一个六边形且隐藏全部轴脊的代码时,出现如下报错:
RegularPolygon._init_() takes 3 positional arguments but 4 were given
报错意思:RegularPolygon.__init__()接受3个位置参数,但给定了4个
通过上网查询、询问同学,我解决了这个问题,其中的解决过程我详细地讲一下:
首先,明白报错意思后,我开始尝试删除其中的任何一个参数,但都还有报错。
只有删除“0.2”后,绘制出了一个四边形,与需要绘制的六边形不符。其中的原因并不知晓,明明设置的多边形顶点数量是6,而绘制出的是四边形。如果有大佬知道原因,欢迎在评论区告诉我!
然后,我怀疑是不是版本导致的问题,就开始重新下载matplotlib库。
pip install matplotlib #下载matplotlib库
pip install --upgrade matplotlib #更新matplotlib库
更新之后,问题还未解决,说明不是版本的问题。
再然后,我去网上查询patches和RegularPolygon的使用方法。
matplotlib.patches是专门用于绘制路径和形状的模块,该模块中包含一些表示形状(例如箭头、圆形、长方形等)的类,通过创建这些类的对象可以快速绘制常见的形状。matplotlib中常见的形状类如表1所示。
表1 matplotlib中常见的形状类
类 说明 Arrow 箭头 Circle 圆形 RegularPolygon 正多边形 Rectangle 矩形 Ellipse 椭圆形 表1中列举的所有类都提供了与类同名的构造方法。以创建正多边形为例,RegularPolygon类的构造方法的语法格式如下所示:
RegularPolygon(xy, numVertices, radius=5, orientation=0, **kwargs)
该方法常用参数的含义如下:
- xy:表示中心点的元组(x, y)。
- numVertices:表示多边形顶点的数量。
- radius:表示从中心点到每个顶点的距离。
- orientation:表示多边形旋转的角度(以弧度为单位)。
例如,通过RegularPolygon()方法创建一个黄色的正五边形,代码如下:
polygon = mapthes.RegularPolygon((0.5, 0.5), numVertices=5, radius=0.3, color='y')
之后,通过Axes对象的add_patch()方法将正五边形polygon添加到画布中,代码如下。
ax = plt.axes([0.3, 0.3, 0.5, 0.5]) ax.add_patch(polygon)
了解使用方法后,还是不太清楚问题出在哪里,我就去询问了同学。(博主:沐曦可期)
他也帮助我去查找原因,当看到博主yimaoyingbi的文章后受到了启发(虽然与解决此问题没有太大关系,但受到了一些启发),怀疑有可能需要修改引用的RegularPolygon类中的内容。 (博主yimaoyingbi文章链接:点击链接)
接着,我就去寻找RegularPolygon类所在的patches模块文件位置。
通过上网查询,知道了可以将光标点到某一方法上,按 Shift + Tab 键,显示帮助文档。
显示后,点“^”是在分页器中显示帮助文档,点“+”是展开所有帮助文档信息,点“×”是关闭帮助文档显示。将帮助文档拉到最底下,就会有引用模块.py文件的详细地址。
按照文件地址,找到patches.py文件 ,然后用PyCharm打开(能打开.py文件的软件都可以)。
按 Ctrl + F 键,查找RegularPolygon类,如下图(代码行数可能不同,但参数定义是相同的)。
在这串代码中,并未理解星号“*”在这里的意思,注释也没有解释。
通过上网查询,星号“*”有很多用法,但在这里是使函数只能接收关键字参数,代码如下:
def genius(*, first_name, last_name): print(first_name, last_name) # genius('Li','Bai') # TypeError: genius() takes 0 positional arguments but 2 were given genius(first_name='Li', last_name='Bai') # Li Bai
上述代码采用了星号“*”限制了星号之后的参数必须采用关键字形式来调用上述函数。 实际上,如果我们只是想将一些参数限制为仅以关键字形式输入同时另一部分参数依旧按照位置形式输入,此时我们可以将位置参数放置在星号之前,代码如下:
def genius(age, *, first_name, last_name): print(first_name, last_name, 'is', age) genius(28, first_name='Li', last_name='Bai') # Li Bai is 28
此内容链接:Python 中星号(*)的用法小结
最后,明白星号“*”在这里的作用后,找出了问题所在:因为星号“*”在radius关键字的前面,所以要使用星号“*”后面的关键字(包括radius)的参数时,就必须采用关键字的形式来调用上述函数。
解决办法:
1、将“0.2”参数前面添加关键字“radius”;(我选择的这一种)
2、可以将星号“*”删去,不在这里限制仅为关键字变参;
3、可以将星号“*”移到“radius”关键字后面,就不会影响“0.2”参数的使用了。
注意:我是用PyCharm来使用Jupyter Notebook的,如果使用是Anaconda,也可以用我以上的解决办法来解决此问题。
标签:__,given,name,关键字,RegularPolygon,matplotlib,星号,报错,参数 From: https://blog.csdn.net/m0_57249993/article/details/139242845本人还是计算机小白,对于一些知识和名词尚未完全理解,还在继续学习中。
若文章中有错误,欢迎各位大佬积极指正,我会虚心接受,努力学习,向你们靠近!