使用 Matplotlib 设置多组小刻度

Ben*_*enT 5 matplotlib python-3.x

我正在尝试使用小刻度自定义我的 x 轴,但我想加粗或加长中间的小刻度。所以基本上我想要我的次要情节有一个主要的、中间的和次要的勾号。我尝试使用tick_params,但这会覆盖之前对刻度线的修改。还有其他方法可以实现这一目标吗?

最终结果应在标记数字之间有 4 个小刻度和 2 个半小刻度。

如果有办法标记半小刻度,那就加分了。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter,
                               AutoMinorLocator)

t = np.arange(0.0, 100.0, 0.1)
s = np.sin(0.1 * np.pi * t) * np.exp(-t * 0.01)

fig, ax = plt.subplots()
ax.plot(t, s)

#Try to set 4 minor ticks
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.tick_params(which='minor', length=2, color='k')

#Set 2 minor ticks that are larger
ax.xaxis.set_minor_locator(AutoMinorLocator(2))
ax.tick_params(which='minor', length=6, color='k')

#Make major ticks even larger
ax.tick_params(which='major', length=12, color='k')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

teo*_*139 2

两种方式。第一个很混乱,最好避免它,但将它包含在这里也没什么坏处。第二个,按照 ImportanceOfBeingErnest 的建议,基于How to add Third level of ticks in python matplotlib

\n\n
fig, ax = plt.subplots()\nax.plot(t, s)\n\nax.xaxis.set_minor_locator(AutoMinorLocator(9))\nax.tick_params(which=\'major\', length=12, color=\'k\')\nminor_labels = list()\ni = 0\nl = -2\nsum_l = 1.125\nfor line in ax.xaxis.get_ticklines(minor=True):\n\n    if i == 0:\n        line.set_markersize(4)\n        minor_labels.append(\'\')\n        i += 1\n        l += sum_l\n    elif i == 2:\n        line.set_markersize(4)\n        minor_labels.append(\'\')\n        i += 1\n        l += sum_l\n    elif i == 4 or i == 6 or i == 10 or i == 12 or i == 16:\n        line.set_markersize(4)\n        minor_labels.append(\'\')\n        i += 1\n        l += sum_l\n    elif i == 18:\n        line.set_markersize(4)\n        minor_labels.append(\'\')\n        i -= 15\n        l += sum_l\n    elif i == 8 or i == 14:\n        line.set_markersize(8)\n        minor_labels.append(l)\n        i += 1\n        l += sum_l\n    else:\n        i += 1\n        l += sum_l\nprint(minor_labels)\nax.set_xticklabels(minor_labels,minor=True)\nplt.setp(ax.xaxis.get_minorticklabels(), rotation=45)\nplt.setp(ax.xaxis.get_ticklabels(), rotation=45)\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n\n

情节 1

\n\n

ImportanceOfBeingErnest\ 的解决方案似乎遵循这个逻辑 \xe2\x80\x94 也许他有别的想法 \xe2\x80\x94 它看起来更好,但我还没有能够重现小/半小刻度组合。也许再花一些时间,您就可以通过调整来实现您的意图。

\n\n
t = np.arange(0.0, 100.0, 0.1)\ns = np.sin(0.1 * np.pi * t) * np.exp(-t * 0.01)\n\nfig, ax = plt.subplots()\nplt.plot(t, s)\nax2 = ax.twiny()\nax2.plot(t, s)\nax2.xaxis.set_ticks_position(\'bottom\')\n\nax.xaxis.set_minor_locator(ticker.FixedLocator(np.arange(5, 100.01, 5)))\nax.tick_params(which=\'minor\', length=8, color=\'k\')\n\nax2.xaxis.set_major_locator(ticker.FixedLocator([]))\nax2.xaxis.set_minor_locator(ticker.FixedLocator(np.arange(1.25, 100.01,1.25)))\nax2.tick_params(which=\'minor\', length=4, color=\'k\')\n\nax.tick_params(which=\'major\', length=12, color=\'k\')\nax.set_xticklabels(np.arange(5, 100.01, 5),minor=True)\nplt.setp(ax.xaxis.get_minorticklabels(), rotation=45)\nplt.setp(ax.xaxis.get_ticklabels(), rotation=45)\nplt.show()\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

情节2

\n