Home » Python » Can i cycle through line styles in matplotlib

Can i cycle through line styles in matplotlib

Posted by: admin November 30, 2017 Leave a comment

Questions:

I know how to cycle through a list of colors in matplotlib. But is it possible to do something similar with line styles (plain, dotted, dashed, etc.)? I’d need to do that so my graphs would be easier to read when printed. Any suggestions how to do that?

Answers:

Something like this might do the trick:

import matplotlib.pyplot as plt
from itertools import cycle
lines = ["-","--","-.",":"]
linecycler = cycle(lines)
plt.figure()
for i in range(10):
    x = range(i,i+10)
    plt.plot(range(10),x,next(linecycler))
plt.show()

Result:
enter image description here

Questions:
Answers:

The upcoming matplotlib v1.5 will deprecate color_cycle for the new prop_cycler feature: http://matplotlib.org/devdocs/users/whats_new.html?highlight=prop_cycle#added-axes-prop-cycle-key-to-rcparams


plt.rcParams['axes.prop_cycle'] = ("cycler('color', 'rgb') +"
"cycler('lw', [1, 2, 3])")

Then go ahead and create your axes and plots!

Questions:
Answers:

If you want the change to be automatic you can add this two lines in
the axes.py file of matplotlib:
Look for that line:

   self.color_cycle = itertools.cycle(clist)

and add the following line underneath:

   self.line_cycle = itertools.cycle(["-",":","--","-.",])

And look for the line:

   kw['color'] = self.color_cycle.next()

and add the line:

   kw['linestyle'] = self.line_cycle.next()

I guess you can do the same for marker.

Questions:
Answers:

here’s a few examples of using the cyclers to develop sets of styles

cyclers can be added to give compositions (red with ‘-‘, blue with ‘–‘, …)

plt.rc('axes', prop_cycle=(cycler('color', list('rbgk')) +
                           cycler('linestyle', ['-', '--', ':', '-.'])))

direct use on Axes:

ax1.set_prop_cycle(cycler('color', ['c', 'm', 'y', 'k']) +
                   cycler('lw', [1, 2, 3, 4]))

cyclers can be multiplied (http://matplotlib.org/cycler/) to give a wider range of unique styles

for ax in axarr:
    ax.set_prop_cycle(cycler('color', list('rbgykcm')) *
                      cycler('linestyle', ['-', '--']))

see also: http://matplotlib.org/examples/color/color_cycle_demo.html

Questions:
Answers:

I use code similar to this one to cycle through different linestyles. By default colours repeat after 7 plots.

idx = 0
for ds in datasets:
    if idx < 7:
        plot(ds)
    elif idx < 14:
        plot(ds, linestyle='--')
    else:
        plot(ds, linestyle=':')
    idx += 1

Questions:
Answers:

Similar to Avaris graphs but different….

import matplotlib.pyplot as plt
import numpy as np

#set linestyles (for-loop method)
colors=('k','y','m','c','b','g','r','#aaaaaa')
linestyles=('-','--','-.',':')
styles=[(color,linestyle) for linestyle in linestyles for color in colors]

#-- sample data
numLines=30
dataXaxis=np.arange(0,10)
dataYaxis=dataXaxis+np.array([np.arange(numLines)]).T


plt.figure(1)

#-----------
# -- array oriented method but I cannot set the line color and styles
# -- without changing Matplotlib code
plt.plot(datax[:,np.newaxis],datay.T)
plt.title('Default linestyles - array oriented programming')
#-----------

#-----------
# -- 'for loop' based approach to enable colors and linestyles to be specified

plt.figure(2)

for num in range(datay.sh![enter image description here][1]ape[0]):
    plt.plot(datax,datay[num,:],color=styles[num][0],ls=styles[num][1])
plt.title('User defined linestyles using for-loop programming')
#-----------

plt.show()