几个matplotlib新手疑问

1 投票
1 回答
1240 浏览
提问于 2025-04-15 17:08

我刚开始使用'matplotlib',遇到了两个大问题,文档和示例都没法解决。以下是我的Python代码:

#!/usr/bin/python
import matplotlib
matplotlib.use('Agg')

import matplotlib.pyplot as plt
for i in range(0,301):

    print "Plotting",i

    # Reading a single column data file
    l=plt.plotfile("gen"+str(i))

    plt.xlabel('Population')
    plt.ylabel('Function Value')
    plt.title('Generation'+str(i))
    plt.axis([0,500,0,180])

    plt.plot()

    if len(str(i)) == 1:
        plt.savefig("../images/plot00"+str(i)+".png")
    if len(str(i)) == 2:
        plt.savefig("../images/plot0"+str(i)+".png")
    if len(str(i)) == 3:
        plt.savefig("../images/plot"+str(i)+".png")

    plt.clf()
  1. 问题1:如你所见,我每次都是清空图表,然后保存新的图表。我想让Y轴的范围保持不变,试着用"plt.axis([0,500,0,180])"来实现。但这似乎不管用,每次都会自动设置。
  2. 问题2:我不想要默认的图表,默认情况下点是用连续的线连接起来的。我想要的图表是用'*'来表示点。我该怎么做呢?

1 个回答

2

  • 正如Tim Pietzcker所说,你可以通过使用字符串数字格式来简化文件名代码的结尾部分。

filename='plot%03d.png'%i

这段代码把%03d替换成整数i,并在前面加上最多三个零。 在Python2.6及以上版本中,你可以用一种不太好看但功能更强大的新字符串格式语法来实现同样的效果:

filename='plot{0:03d}.png'.format(i)

  • 如果你想用星星来表示点,可以使用选项marker='*'。如果想去掉连接线,可以用linestyle='none'
  • plt.plotfile(...)用于绘制图形。调用plt.plot()会在第一幅图上叠加第二幅图。调用plt.plot()似乎会改变坐标轴的尺寸,从而覆盖plt.axis(...)的效果。幸运的是,解决方法很简单:就是不要调用plt.plot()。你根本不需要它。
  • #!/usr/bin/env python
    import matplotlib
    import matplotlib.pyplot as plt
    
    matplotlib.use('Agg')   # This can also be set in ~/.matplotlib/matplotlibrc
    for i in range(0,3):
        print 'Plotting',i
        # Reading a single column data file
        plt.plotfile('gen%s'%i,linestyle='none', marker='*')
    
        plt.xlabel('Population')
        plt.ylabel('Function Value')
        plt.title('Generation%s'%i)
        plt.axis([0,500,0,180])
        # This (old-style string formatting) also works, especial for Python versions <2.6:
        # filename='plot%03d.png'%i
        filename='plot{0:03d}.png'.format(i)
        print(filename)
        plt.savefig(filename)
        # plt.clf()  # clear current figure
    

    撰写回答