我正在尝试制作point and figure chart。我可以让它在终端上打印出来,但我想用matplotlib绘制它。做这样的事情最好的方法是什么?我在思考分散,但是当我这样做时,列分散得太远了。我想得到的东西很像我提供的链接中的图表,其中列尽可能彼此接近。有没有我可以覆盖的参数来强迫这个?第一次使用matplotlib所以请原谅我,如果这是微不足道的。感谢。
答案 0 :(得分:12)
您可以选择s
parameter来调整散点图中使用的符号大小。您还可能需要调整图形的大小(使用figsize)或轴的尺寸(使用add_axes)。这是因为散射的符号是方形的,以显示单位表示,并且x和y轴不会自动调整,因此一个宽度的变化=一个盒子的高度。
换句话说,您提供的示例是一个高度为>的矩形图。选择宽度,高度和宽度,使得一个宽度变化= =一个盒子的高度。
以下是应用这些技术的示例:
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()
为每个散点图开发的方法是非常hackish,但关键是我需要使用散点s
参数和数字大小来获得所需的效果。
结果图是:
理想情况下,可以在分散方法之后建立自定义方法。它会创建一个自定义Collection
instance,其中包含x,o和月标签。它还会a)自动调整轴/图形方面或b)制作不对称符号。这显然是一个高级选项,适用于希望作为开发人员为Matplotlib项目贡献的人。
答案 1 :(得分:0)
没有亲身经历,但可能来自here的set_view_interval()或set_data_interval()?我使用Matplotlib作为项目,但没有必要修复x轴宽度。