我正在尝试制作一个点和图表.我可以让它在终端上打印出来,但我想用matplotlib绘制它.做这样的事情最好的方法是什么?我在思考分散,但是当我这样做时,列分散得太远了.我想得到的东西很像我提供的链接中的图表,其中列尽可能彼此接近.有没有我可以覆盖的参数来强迫这个?第一次使用matplotlib所以请原谅我,如果这是微不足道的.谢谢.
Yan*_*ann 13
您可以通过选择s 参数来调整散点图中使用的符号大小.您还可能需要调整图形的大小(使用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()
Run Code Online (Sandbox Code Playgroud)
为每个散点图开发的方法是非常hackish,但关键是我需要使用散射s参数和图形大小来获得所需的效果.
结果图是:

理想情况下,可以在散射方法之后建立自定义方法.它将创建一个包含x,o和月标签的自定义Collection 实例.它还会a)自动调整轴/图形方面或b)制作不对称符号.这显然是一个高级选项,适用于希望作为开发人员为Matplotlib项目贡献的人.