我正在尝试制作 point and figure chart .我可以让它在终端上打印出来,但我想用 matplotlib 绘制它。做这样的事情最好的方法是什么?我在想分散,但是当我这样做时,列分散得太远了。我想从我提供的链接中获得与图表非常相似的内容,其中各列尽可能彼此靠近。有没有我可以覆盖的参数来强制执行此操作?第一次使用 matplotlib,所以如果这是微不足道的,请原谅。谢谢。
最佳答案
您可以通过选择 s
parameter 来调整散点图中使用的符号的大小.您可能还需要调整图形的大小(使用 figsize )或轴的尺寸(使用 add_axes )。这是因为散点的符号是方形的,以显示单位表示,并且不会自动调整 x 轴和 y 轴,因此 width-of-one-change = height-of-one-box。
换句话说,您提供的示例是一个高度 > 宽度的矩形图,并且选择高度和宽度以使一次更改的宽度 == 一次框的高度。
下面是应用这些技术的示例:
import matplotlib.pyplot as plt
BOX = 5
START = 365
changes = (8, -3, 4, -4, 12, -3, 7, -3, 5, -9, 3)
# one way to force dimensions is to set the figure size:
fig = plt.figure(figsize=(5, 10))
# another way is to control the axes dimensions
# for axes to have specific dimensions:
# [ x0, y0, w, h] in figure units, from 0 to 1
#ax = fig.add_axes([.15, .15, .7*.5, .7])
ax = fig.add_axes([.15, .15, .7, .7])
def sign(val):
return val / abs(val)
pointChanges = []
for chg in changes:
pointChanges += [sign(chg)] * abs(chg)
symbol = {-1:'o',
1:'x'}
chgStart = START
for ichg, chg in enumerate(changes):
x = [ichg+1] * abs(chg)
y = [chgStart + i * BOX * sign(chg) for i in range(abs(chg))]
chgStart += BOX * sign(chg) * (abs(chg)-2)
ax.scatter(x, y,
marker=symbol[sign(chg)],
s=175) #<----- control size of scatter symbol
ax.set_xlim(0, len(changes)+1)
fig.savefig('pointandfigure.png')
plt.show()
为每个散点图开发的方法非常老套,但关键是我需要使用散点图 s
参数和图形大小来获得所需的效果。
结果图是:
理想情况下,可以创建一个仿照分散方法的自定义方法。它将创建一个自定义 Collection
instance这将包括 x、o 和月份标签。它还将 a) 自动调整轴/图形方面或 b) 制作不对称符号。这显然是一个高级选项,适用于希望作为开发人员为 Matplotlib 项目做出贡献的人。
关于python - 使用 matplotlib 绘制点数图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750648/