【问题标题】:Using Matplotlib to create a partial multiplication table checkerboard?使用 Matplotlib 创建部分乘法表棋盘?
【发布时间】:2011-06-06 18:46:37
【问题描述】:

我的孩子正在尝试学习他的乘法表,我正在考虑使用 matplotlib 创建一个部分填写的乘法表供他练习。棘手的部分是让水平轴和垂直轴的文本在 tic 标记之间对齐,而不是在 tic 标记上居中。

关于如何开始使用这个有什么想法吗?

提前致谢。

【问题讨论】:

  • 您考虑过使用电子表格吗?
  • 正如@Thomas 建议的那样,使用您最喜欢的支持表格的软件(如 Microsoft 或 Open Office 软件包(或同等产品)之一)可能更容易做到这一点。

标签: python numpy matplotlib


【解决方案1】:

正如大家已经说过的,matplotlib 确实不是最好的工具……如果你真的想以编程方式来做,那么生成 HTML 真的会更容易。

话虽如此,这是一个很好的例子。

调整轴标签位置的最简单方法是将它们替换为文本对象,或者保持原样并打开小网格。 (标签对象有一个set_position 方法,但它实际上并没有改变它们的位置。我不确定这是故意还是错误......)我将在这里使用后一种技术......

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import numpy as np

maxnum = 13
numfilled = 40
x = np.random.randint(0, maxnum, size=numfilled)
y = np.random.randint(0, maxnum, size=numfilled)
z = x * y

fig, ax = plt.subplots()

for X,Y,Z in zip(x,y,z):
    ax.text(X+0.5,Y+0.5,str(Z), ha='center', va='center')

ax.axis([0, maxnum, 0, maxnum])

for axis in [ax.xaxis, ax.yaxis]:
    axis.set_minor_locator(MultipleLocator(1))
    axis.set_ticks(np.arange(maxnum) + 0.5)
    axis.set_ticklabels(range(maxnum))

ax.grid(which='minor')
ax.xaxis.set_ticks_position('top')

plt.show()

【讨论】:

  • 谢谢!这是极好的。您能否提供有关 MultipleLocator 正在做什么的更多信息。我查看了 matplotlib 网站上的文档,但不清楚。
  • 实际上,它只是每隔n 个单位放置一个刻度(这里是n=1)。次要刻度的默认刻度定位器将 n 刻度放置在 主要刻度之间。通常,您只需执行ax.minorticks_on(),但这会在每个主要刻度之间放置 4 或 5 个(我忘记了)刻度。为了解决这个问题,您需要将次要刻度定位器显式设置为其他值。因为我们希望在偶数间隔内滴答,MultipleLocator 是我们想要的定位器规则。希望这有点道理!
  • 顺便说一句,您可以完全跳过次要刻度网格并使用ax.axvlineax.axhline 绘制网格线。回想起来,这可能更容易理解!
  • 也许 ax.axhline 会更直接,但我认为您所说明的技术对阅读本文的每个人都很有价值。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多