[Fixed] *args calling plt.plot() for each optional argument

Question (Issue)

I’m having some trouble with passing an arbitrary number of arguments to plt.plot(). For each argument I try to pass via *args my function calls plt.plot() two times creating duplicates for each optional argument. The read_n_plot function is meant to read some datafile, spit out the data as lists, and create a plot of said data. If I want to create a plot of an XRD standard for a crystal I want to make it easily distinguishable from whatever experimental data I’m comparing it with.

From what I understand *args is a tuple containing all the arguments passed to my function. But I can’t seem to figure out how to pass everything inside *args as is, and not calling plt.plot(arg1) -> plt.plot(arg2) -> etc

Got any hints I could try?

Here is my code:

import matplotlib.pyplot as plt

#def read_n_plot(datafile, color, thickness, style = '-', *args):
def read_n_plot(datafile, *args, **kwargs):
    vinkel = []
    intensitet = []
    with open(datafile, encoding='utf8', errors='ignore') as f:
        if datafile.endswith('.int'):
            next(f); next(f)
        lines = f.readlines()
        for line in lines:
            if line and line[0].isalpha():
                continue
            data = line.split()
            theta, counts = float(data[0]), float(data[1])
            vinkel.append(theta)
            intensitet.append(counts)
    intensitet_norm = [i/max(intensitet) for i in intensitet]
    plt.plot(vinkel, intensitet_norm, label = datafile, *args, **kwargs)
    return vinkel, intensitet_norm

plt.figure(figsize=(16,9))
read_n_plot('NaCl_data.xy', 'k', '--', lw = 1.0)
plt.legend(loc='best')
plt.xlabel(r'$2\theta$')
plt.xlim(0, 65)
plt.ylabel('Intensitet (a.u.)')
plt.tick_params(left=None)
plt.yticks([])
plt.show()

Example below uses standard powder XRD data for NaCl. It seems the '--' argument for linestyle didn’t get through at all. The legend says there are two plots.

NaCl XRD data duplicate:

NaCl XRD data duplicate

Now we will see Solution for issue: *args calling plt.plot() for each optional argument


Answer (solution)

By referring to the official document of matplotlib.pyplot.plot(), we can find that linestyle is a keyword argument. This is why your code doesn’t work as you expected. Try replace ‘--' with ls='--'.

This question is answered By – x pie

This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0