9

I need to use the "savefig" in Python to save the plot of each iteration of a while loop, and I want that the name i give to the figure contains a literal part and a numerical part. This one comes out from an array or is the number associated to the index of iteration. I make a simple example:

# index.py

from numpy import *
from pylab import *
from matplotlib import *
from matplotlib.pyplot import *
import os

x=arange(0.12,60,0.12).reshape(100,5)
y=sin(x)

i=0

while i<99
  figure()
  a=x[:,i]
  b=y[:,i]
  c=a[0]
  plot(x,y,label='%s%d'%('x=',c))

  savefig(#???#)      #I want the name is: x='a[0]'.png
                      #where 'a[0]' is the value of a[0]

thanks a lot.

user1872346
  • 91
  • 1
  • 1
  • 2

3 Answers3

6

Well, it should be simply this:

savefig(str(a[0]))

This is a toy example. Works for me.

import pylab as pl
import numpy as np

# some data
x = np.arange(10)

pl.figure()
pl.plot(x)
pl.savefig('x=' + str(10) + '.png')
blueSurfer
  • 5,651
  • 13
  • 42
  • 63
  • 1
    Did you mean `savefig('%s.png' % (str(a[0])))` ? – mmgp Dec 03 '12 at 12:35
  • well, `savefig(str(a[0]))` doesn't produce anything. It is correct the use of `savefig('%s.png' % (str(a[0])))` , but in this case the name of the images will be "0.12.png", "0.24.png", etc. I want the names are "x=0.12.png" "x=0.24.png", etc. thanks again for your help – user1872346 Dec 03 '12 at 12:46
3

I had the same demand recently and figured out the solution. I modify the given code and correct several explicit errors.

from pylab import *
import matplotlib.pyplot as plt

x = arange(0.12, 60, 0.12).reshape(100, 5)
y = sin(x)
i = 0

while i < 99:
    figure()
    a = x[i, :]                   # change each row instead of column
    b = y[i, :]                   

    i += 1                        # make sure to exit the while loop

    flag = 'x=%s' % str(a[0])     # use the first element of list a as the name
    plot(a, b, label=flag)
    plt.savefig("%s.png" % flag)

Hope it helps.

Eric
  • 2,636
  • 21
  • 25
3

Since python 3.6 you can use f-strings to format strings dynamically:

import matplotlib.pyplot as plt

for i in range(99):
    plt.figure()
    a = x[:, i]
    b = y[:, i]
    c = a[0]
    plt.plot(a, b, label=f'x={c}')

    plt.savefig(f'x={c}.png')
Chris Adams
  • 18,389
  • 4
  • 22
  • 39