首页 > 解决方案 > 等效于列表理解的映射不起作用

问题描述

我想在matplotlib. 列表理解工作得很好:

[tick.set_rotation(45) for tick in ax.get_xticklabels()]

但是使用的等效代码map不起作用:

map(lambda tick: tick.set_rotation(45), ax.get_xticklabels())

也不:

map(operator.methodcaller('set_rotation', 45), ax.get_xticklabels())

我在这里想念什么?我应该注意,使用map编译好的代码,但它不会旋转刻度标签。

标签: pythonmatplotlibsyntax

解决方案


注意代码行

map(lambda tick: tick.set_rotation(45), ax.get_xticklabels())

在 python 2 中工作得非常好。这是因为在 python 2 中,map生成一个列表,有效地评估每个元素的映射函数。

在 python 3 中,map创建一个 的实例map,它本质上是一个迭代器,除非需要,否则它不会被迭代。

因此,python 3 的解决方案可能是listmap,

list(map(lambda tick: tick.set_rotation(45), ax.get_xticklabels()))

更惯用的方法可能是循环遍历刻度标签,

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

考虑到您通常如何在 matplotlib 中旋转刻度标签,但它宁愿是

 plt.setp(ax.get_xticklabels(), rotation=45)

或者

 ax.tick_params(axis="x", rotation=45)

推荐阅读