Matplotlib 刻度线粗细

39

有没有一种方法可以在不编写像这样长的代码块的情况下增加 matplotlib 中刻度线的厚度和大小:

for line in ax1.yaxis.get_ticklines():
    line.set_markersize(25)
    line.set_markeredgewidth(3)

这段代码的问题在于它使用了一个循环,而循环通常消耗大量的CPU资源。


非常相关于https://dev59.com/0mUq5IYBdhLWcg3wMNiu。 - tacaswell
3个回答

57

一个更简单的方法是使用axis对象的set_tick_params函数:

ax.xaxis.set_tick_params(width=5)
ax.yaxis.set_tick_params(width=5)

用这种方式可以在不担心全局状态以及不做任何关于 mpl 对象内部结构的假设的情况下,按每个轴单独更改此内容。

如果你想为你的轴中的所有刻度设置此内容,

ax = plt.gca()
ax.tick_params(width=5,...)

请查看set_tick_params文档和tick_params有效关键词


1
缺少 's'?对我来说应该是ax.tick_params()。 - mikuszefski
@tylerswright 感谢您修复了一个存在已久(并且被点赞?!)的错别字。 - tacaswell
如何更改每个 n 次 tick_params 的宽度。 - Khalil Al Hooti

23
你可以使用rcParams来改变所有matplotlib的默认设置,如下所示。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# set tick width
mpl.rcParams['xtick.major.size'] = 20
mpl.rcParams['xtick.major.width'] = 4
mpl.rcParams['xtick.minor.size'] = 10
mpl.rcParams['xtick.minor.width'] = 2

x = np.linspace(0., 10.)
plt.plot(x, np.sin(x))

plt.show()

6
你可以使用 matplotlib.pyplot.setp
plt.setp(ax.yaxis.get_ticklines(), 'markersize', 25)
plt.setp(ax.yaxis.get_ticklines(), 'markeredgewidth', 3)

您也可以使用列表推导式,虽然没有返回值可能并没有太多意义,但可以减少代码行数。详情请参见此处
[line.set_markersize(25) for line in ax1.yaxis.get_ticklines()]
[line.set_markeredgewidth(3) for line in ax1.yaxis.get_ticklines()]

如果您从不使用生成的列表,为什么列表推导式会更有效率呢? - David Zwicker
1
你说得对。如果我正确理解了这篇文章,它甚至可能会更糟糕(对于效率和可读性)。我会编辑我的回答。顺便说一句,这证明了像stackoverflow这样的工具是一个很好的工具,因为有时候你通过回答问题学到的比提问还要多。 - Francesco Montesano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接