用dict()或大括号指定字典参数
在matplotlib主页中,有一个由Nicolas Rougier编写的教程链接。 在题为“魔鬼在细节中”的教程部分,剧本:
http://www.loria.fr/~rougier/teaching/matplotlib/scripts/exercice_10.py
产生显示在网页上的数字。 该脚本的第48行是:
label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))
如果我们通过以下方式替换此行
label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65})
那么就不会考虑edgecolor请求。 我会认为上述两个陈述是相同的。 我已经向教程的作者Nicolas Rougier询问了这件事,他也很惊讶。 这是Matplotlib的错误吗?
您可以轻松确定两个dicts
是否相同:
dict(facecolor='white', edgecolor='None', alpha=0.65 ) ==
{"facecolor": "white", "edgecolor": "None", "alpha":0.65}
这是True
。
但是,如果将这些文字输入到Python解释器中,则生成的词典编号的值将以不同的顺序repr
。
{'alpha': 0.65000000000000002, 'facecolor': 'white', 'edgecolor': 'None'}
{'edgecolor': 'None', 'facecolor': 'white', 'alpha': 0.65000000000000002}
这可能会根据您使用的Python版本而有所不同,我相信在较新版本的Python中,它会随着解释器的运行而变化; 哈希播种是随机化的,以防止字典构造的恶意性能较差。 以上输出来自Python 2.6.6(Win32)。
Python dict
是无序的,我们的意思是你不能依赖订单。 但是,在迭代字典时,元素必须以某种顺序出现。 这个顺序受项目插入顺序的影响,虽然不明显,但它们在这两个字典中以两种不同的顺序插入: dict()
构造函数获取关键字字典,然后将其插入到构造的dict
,所以实际上第一个dict
的元素插入两次! 首先按照您指定的顺序,然后按照该步骤构建的字典中的顺序排列。
假设:在matplotlib
(或者你使用的Python版本)中有一些关心字典项目出现顺序的东西。事实上,由于第二个edgecolor
键首先是它的,也许它跳过了第一个值,或者也许是后面的值之一有副作用,导致它覆盖edgecolor
(例如, facecolor
也会设置edgecolor
以确保面之间没有间隙)。 这可能会被合理地称为一个错误,因为行为可能会根据关键字出现在字典中的顺序而有所不同。
如果您用以下内容替换该行:
label.set_bbox({"facecolor": "white", "alpha":0.65, "edgecolor": "None",})
它工作正常。
我认为这是set_alpha
一个错误,或者可能是渲染器中的错误。
作为解决方法,您可以将行宽设置为0:
label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65, 'lw':0})
这将确保该线不会被绘制,与颜色/ alpha是什么无关。
代码的工作方式,你传递set_bbox
一个dict
,然后存储在_bbox
。 在绘制的时候,如果_bbox
不是None
(并且没有_bbox_patch
),则_bbox
被传递给patches.bbox_artist
,它是一个函数(在docstring中标记为调试函数!),它使用dict
来即时生成Rectangle
对象(不返回!)。 set_ set_*
中的set_*
并在矩形中draw
是错误的位置。
上一篇: Specifying dictionary argument with dict() or braces matters in set