Home > Software design >  Matplotlib - Several lines on the same plot
Matplotlib - Several lines on the same plot

Time:12-04

I am converting some old Python 2.7 code to 3.6. My routine plots the first line OK but subsequent lines seem to start where the previous line left off. (Running on-line at www.pythonanywhere.com)

My code:

import matplotlib
from matplotlib import pyplot;

k = 0
while k < len(Stations):

    # Draw the graph
    fig.patch.set_facecolor('black') # Outside border
    pyplot.rcParams['axes.facecolor'] = 'black' # Graph background
    pyplot.rcParams['axes.edgecolor'] = 'red'
    pyplot.tick_params(axis='x', colors='yellow')
    pyplot.tick_params(axis='y', colors='yellow')
    pyplot.ylim(float(BtmLimit),float(TopLimit))
    pyplot.ylabel("Percent of normal range.", size=10, color = "yellow")
    pyplot.xticks([]) # Hide X axis
    pyplot.title("Plotted at %sGMT, %s %s %s" % (thour, tday, tdate, tmonth), color = "yellow")
    if Error == 'False': pyplot.plot(Epoch, Scaled, color = (Color), linewidth=1.9)
    pyplot.plot(Epoch, Top, color = [0,0.5,0]) # Green lines
    pyplot.plot(Epoch, Btm, color = [0,0.5,0])
    k = k   1

pyplot.savefig(SD 'RiverLevels.png', facecolor='black', bbox_inches='tight')
pyplot.show()
pyplot.close()

The data looks like this:

Epoch ['1638046800', '1638047700', '1638048600', '1638049500', '1638050400', '1638051300', '1638052200', '1638053100', '1638054000', '1638054900', '1638 055800', '1638056700', '1638057600', '1638058500', '1638059400', '1638060300', '1638061200', '1638062100', '1638063000', '1638063900', '1638064800 ', '1638065700', '1638066600', '1638067500', '1638068400', '1638069300', '1638070200', '1638071100', '1638072000', '1638072900', '1638073800', '16 38074700', '1638075600', '1638076500', '1638077400', '1638078300', '1638079200', '1638080100', '1638081000', '1638081900', '1638082800', '16380837 00', '1638084600', '1638085500', '1638086400', '1638087300', '1638088200', '1638089100', '1638090000', '1638090900', '1638091800', '1638092700', ' 1638093600', '1638094500', '1638095400']

Scaled ['32.475247524752476', '33.069306930693074', '33.76237623762376', '33.56435643564357', '33.56435643564357', '33.86138613861387', '34.1584158415841 6', '34.35643564356436', '34.554455445544555', '34.554455445544555', '34.75247524752476', '34.95049504950495', '35.049504950495056', '35.148514851 48515', '35.049504950495056', '35.14851485148515', '35.44554455445545', '35.54455445544555', '35.54455445544555', '35.34653465346535', '35.5445544 5544555', '35.64356435643565', '35.84158415841585', '35.742574257425744', '35.54455445544555', '35.44554455445545', '35.44554455445545', '35.34653 465346535', '35.24752475247525', '35.049504950495056', '34.95049504950495', '34.95049504950495', '34.851485148514854', '34.65346534653466', '34.35 643564356436', '34.15841584158416', '34.35643564356436', '34.35643564356436', '34.25742574257426', '34.05940594059406', '33.86138613861387', '33.6 63366336633665', '33.86138613861387', '33.663366336633665', '33.663366336633665', '33.46534653465347', '33.366336633663366', '33.56435643564357', '33.663366336633665', '33.663366336633665', '33.663366336633665', '33.663366336633665', '33.960396039603964', '34.05940594059406', '34.05940594059 406']

Output image

CodePudding user response:

I guess this may be due to using strings instead of numbers. When you use strings, the x values are taken as categories and not ordered numerically but in the order they appear in the list (unless a category is exactly repeated). I understand that the snippet is not complete, but the values of Epoch and Scaled actually change on each iteration.

After plotting the first set of data, any values not present in the first set will be positioned "afterwards" those of the first set (ie: to the right of first set's last point in x, and higher than the last point in y). When the second set of data is plotted, the first x values have not appeared in the previous set, so they are plotted afterwards (beginning of light blue line in the plot), regardless of their numeric value. Then, the final values are the same of those that had appeared in the first set, so the line goes back to the left of the figure.

You can try using [float(x) for x in Epoch] and [float(y) for y in Scaled] in the plots. As I see that there are spaces in the strings representing the numbers, you could use a function like this:

def flist_from_slist(data):
   return [float(x.replace(' ', '')) for x in data]

And replace the pyplot.plot call by:

pyplot.plot(flist_from_slist(Epoch), flist_from_slist(Scaled), linewidth=1.9)

Moreover, there is a lot of code inside the loop that could be moved outside (setting the ticks, labels, etc).

  • Related