使用matplotlib绘制点数图表
我正在尝试制作一个点线图。我可以在终端上打印出来,但我想用matplotlib来绘制这个图。请问有什么好的方法可以做到这一点吗?我在考虑使用散点图,但这样做的时候,列之间的间距太大了。我希望能像我提供的链接中的图表那样,让列尽可能靠近。有没有什么参数可以调整来实现这个效果?这是我第一次使用matplotlib,如果这很简单请多多包涵。谢谢。
2 个回答
0
我能做的就是修改一下颜色。
chgStart = START
colors=['red','black','green','blue']
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, color = colors[int(sign(chg))] ) #<----- control size of scatter symbol
16
你可以通过选择 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()
为每个散点图开发的方法有点笨拙,但关键是我需要调整散点的 s
参数和图形的大小,以达到想要的效果。
最终得到的图是:
理想情况下,可以创建一个自定义的方法,模仿散点图的方法。这个方法会创建一个自定义的 Collection
实例,里面包含 x、o 和月份标签。它还可以 a) 自动调整坐标轴/图形的比例,或者 b) 制作不对称的符号。这显然是一个高级选项,适合那些希望作为开发者为 Matplotlib 项目做贡献的人。