使用matplotlib绘制点数图表

9 投票
2 回答
7881 浏览
提问于 2025-04-17 09:38

我正在尝试制作一个点线图。我可以在终端上打印出来,但我想用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 参数和图形的大小,以达到想要的效果。

最终得到的图是:

enter image description here

理想情况下,可以创建一个自定义的方法,模仿散点图的方法。这个方法会创建一个自定义的 Collection 实例,里面包含 x、o 和月份标签。它还可以 a) 自动调整坐标轴/图形的比例,或者 b) 制作不对称的符号。这显然是一个高级选项,适合那些希望作为开发者为 Matplotlib 项目做贡献的人。

撰写回答