Matplotlib — несколько строк на одном графике

#python #matplotlib

#python #matplotlib

Вопрос:

Я конвертирую какой-то старый код Python 2.7 в 3.6. Моя процедура отображает первую строку нормально, но последующие строки, похоже, начинаются там, где закончилась предыдущая строка. (Выполняется в режиме онлайн на www.pythonanywhere.com )

Мой код:

 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()
 

Данные выглядят следующим образом:

Эпоха [‘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’]

Масштабированный [‘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’]

Выходное изображение

Комментарии:

1. Можете ли вы объяснить, почему вы используете цикл? Я не смог найти ваше использование «k» в цикле while. Похоже, вы можете устранить цикл.

Ответ №1:

Я предполагаю, что это может быть связано с использованием строк вместо чисел. При использовании строк x значения берутся как категории и упорядочиваются не численно, а в том порядке, в котором они отображаются в списке (если категория не повторяется в точности). Я понимаю, что фрагмент не является полным, но значения Epoch и Scaled фактически меняются на каждой итерации.

После построения первого набора данных любые значения, отсутствующие в первом наборе, будут расположены «после» значений первого набора (т. Е. Справа от последней точки первого набора в x и выше последней точки в y ). При построении второго набора данных первые x значения не появились в предыдущем наборе, поэтому они отображаются впоследствии (начало светло-синей линии на графике), независимо от их числового значения. Затем конечные значения совпадают с теми, которые появились в первом наборе, поэтому строка возвращается влево от рисунка.

Вы можете попробовать использовать [float(x) for x in Epoch] и [float(y) for y in Scaled] в графиках. Поскольку я вижу, что в строках, представляющих числа, есть пробелы, вы могли бы использовать такую функцию:

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

И замените pyplot.вызов графика с помощью:

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

Более того, внутри цикла много кода, который можно переместить наружу (установка тиков, меток и т. Д.).

Комментарии:

1. Нет, ваш ответ неверен. Вы можете передавать строки чисел для построения строки. (Вы можете написать это как комментарий и попросить человека уточнить вопрос.)

2. Вы правы, но я пока не могу комментировать. Проблема с использованием строк заключается в том, что значения обрабатываются как категории, а не как числа. Я предполагаю, что в полном коде (фрагмент не кажется полным) Epoch и Scaled изменяется с каждой итерацией, но поскольку некоторые категории повторяются на разных графиках, строки переходят туда и обратно.

3. Спасибо, это исправлено. Конечный результат можно увидеть здесь: [ссылка] boneyard.pythonanywhere.com/RiverScraper/RiverLevels01.htm @azelcer