使用Matplotlib制作点数图表

9

我正在尝试制作一个“点数图表”(point and figure chart)。我可以在终端上打印出它,但我想用matplotlib进行图形化呈现。最好的方式是什么?我想使用scatter函数,但这样会使列分得太开了。我希望能获得与我提供链接中的图表非常相似的效果,其中列尽可能地靠近彼此。是否有一个参数可以被覆盖以强制执行这个效果?这是我第一次使用matplotlib,请原谅我如果这很琐碎。谢谢。


如果Jeff在这里听着,你说你已经成功地在终端上打印了P&F图表。能否请您分享Python代码(或至少是逻辑)?我正在尝试在Python中开发P&F图表。如果可以在终端上打印出来,我将尝试将其转换为HTML格式。谢谢。 - Vineet
你是否曾经成功绘制过一个点数图表? - Jonathan Holloway
3个回答

16
您可以通过选择sparameter来调整散点图中使用的符号的大小。您还可能需要调整图形的大小(使用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

理想情况下,一个人可以根据scatter方法创建一个自定义方法。它将创建一个自定义的instance集合,其中包括x、o和月份标签。它还会自动调整轴/图形方面或制作非对称符号。这显然是一种高级选项,适用于希望作为Matplotlib项目开发者做出贡献的人。

干得好!当我单独运行您的代码时,每列都是不同的颜色,但您的示例中有黑色x和蓝色o。如何强制更改颜色? - Rockport Redfish
你好,我正在尝试组装一个“点数图表”。 你的回答很清楚地解释了我应该如何开始,但是我发现了一些需要解决的情况:1- 颜色问题我已经解决并在下面回答了,但我认为我的回答很丑陋。 2- 图形的尺寸不可缩放,也就是说,如果我在名为“changes”的元组或列表中插入100个值,则由于其尺寸,图形会失去其形状。 - Elias Coutinho

0

我个人没有经验,但也许可以尝试使用这里的set_view_interval()或set_data_interval()函数?我曾在一个项目中使用过Matplotlib,但没有涉及到调整x轴宽度的问题。


如果您在数据框中有X和O,您将如何制作相同的图形? - Jonathan Holloway

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接