# [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):
vinkel = []
intensitet = []
with open(datafile, encoding='utf8', errors='ignore') as f:
if datafile.endswith('.int'):
next(f); next(f)
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:

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

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='--'.