Проблема:
Так что я думаю, что теперь я понимаю, что вы пытаетесь сделать, и я постараюсь решить вашу маленькую проблему. НО, как я вижу, ваш небольшой фрагмент кода полон мелких и серьезных недостатков, и вам нужно будет больше ознакомиться с основами Python, иначе вы будете сталкиваться с проблемами на каждом шагу. Но об этом позже ... Вот мое «решение» (надеюсь, оно работает):
Сначала поместите все ваши операторы импорта в начало вашего скрипта (за исключением некоторых исключений) и фактически импортируйте matplotlib как plt:
import numpy as np
import matplotlib.pyplot as plt
import xlrd
Тогда вам кажется, что вам нужна функция, которая возвращает вам несколько самых больших значений из некоторого списка. Давайте сделаем это:
def nLargest(ls, n):
'''return the n largest entries in ls'''
return list(reversed(sorted(ls)[-n:]))
Эта функция принимает два аргумента: список и число самых больших значений, которые должны быть возвращены. Сначала он сортирует данные с помощью «sorted (ls)» (от низшего к наибольшему) и принимает последние «n» элементов с «[-n:]».
Затем список переворачивается (от верхнего к низшему) и возвращается.
Теперь просто определите некоторые значения, загрузите данные и вычислите нужные значения:
sheetIndex = 0
col = 1
start = 2
end = 1441
book = xlrd.open_workbook("inc.xlsx")
sheet = book.sheet_by_index(sheetIndex)
incData = sheet.col_values(col, start_rowx=start, end_rowx=end)
book = xlrd.open_workbook('mok.xlsx')
sheet = book.sheet_by_index(sheetIndex)
mokData = sheet.col_values(col, start_rowx=start, end_rowx=end)
book = xlrd.open_workbook('sok.xlsx')
sheet = book.sheet_by_index(sheetIndex)
sokData = sheet.col_values(col, start_rowx=start, end_rowx=end)
averages = [np.average(nLargest(incData, 3)), # use numpy for averaging
np.average(nLargest(mokData, 3)),
np.average(nLargest(sokData, 3))]
Наконец, чтобы построить его так, как вы хотите:
vals = [1., 2., 3.]
plt.plot(vals, averages)
plt.xticks(vals, ["inc","mok","sok"])
plt.title("Free")
plt.ylabel("Significant wave height (cm)")
plt.xlabel("source files")
plt.show()
Все остальные проблемы
Теперь я хочу потратить некоторое время на просмотр вашего исходного кода и просто буду критиковать везде, где мне это нравится:
def follow_up():
col = 1
return max(sheet.col_values(col, start_rowx=2, end_rowx=1441)[:3])
Честно говоря, эта функция (и большинство других) заставила меня так сильно сжаться ... Вы не должны изменять или действительно получать доступ к глобальным переменным внутри функции. Вызов функции сам по себе должен содержать большую часть данных, которые понадобятся функции (или, по крайней мере, всю информацию для получения данных). Вы написали два раза три функции, которые по сути делают одно и то же для другого набора данных. Хотя для этого и нужна функция, вам нужно просто написать одну функцию и использовать ее для всех данных, примерно так:
def follow_up(sheet, col, start, end, n):
'''This function will still not work but at least it's a function...'''
return max(sheet.col_values(col, start_rowx=start, end_rowx=end)[:n])
Затем вы делаете "import xlrd" несколько раз. Нет необходимости в этом.
Ваше построение также нуждается во втором или третьем взгляде. Обязательно прочитайте справочные руководства по библиотекам, которые вы используете, хотя бы чуть-чуть, прежде чем использовать их.
Источники:
https://xlrd.readthedocs.io/en/latest/api.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
На этих сайтах много информации и примеров.