Вы хотели сделать график данных, которые у меня есть в excel используя python. В первой колонне excel у меня есть значения времени (ось x), и в других колоннах значения inensidad (ось y) для каждого времени.
Поскольку я прочитал, я могу использовать openpyxel, чтобы читать excel. Потом я представляю, что происходить ты оценил их в матрицу numpy, и потом делать график с matplotlib.
Не, если я это выдвигаю хорошо.
Вы могли бы говорить мне, играло ли роль это так? Маленький пример был бы великолепным!
Я довожу до сведения, что никогда он не использовал openpyxel раньше (если я помещаю лапу... XD). Используя Openpyxl
, NumPy и matplotlib:
from itertools import cycle
from openpyxl import load_workbook
import numpy as np
import matplotlib.pyplot as plt
#cargamos el xlsx en memoria
wb = load_workbook('datos.xlsx', data_only=True)
#cargamos la hoja
sheet1 = wb.get_sheet_by_name('Hoja1')
#creamos la matriz en numpy
matriz = np.zeros((sheet1.max_row, sheet1.max_column))
#leemos la hoja fila por fila y vamos guardando los valores 'x' e 'y'
for i in range(0,sheet1.max_row):
for j in range(0,sheet1.max_column):
matriz[i,j]=sheet1.cell(row=i+1, column=j+1).value
#creamos el grafico
colors = cycle(["aqua", "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "purple", "red", "silver", "teal", "yellow"])
plt.xlabel('tiempo')
plt.ylabel('intensidad')
for y in range(1, sheet1.max_column):
plt.plot(matriz[:,0],matriz[:,y], label="Data " + str(y), color=next(colors))
plt.legend(loc='upper left', fontsize='small')
plt.grid(True)
plt.xlim(0,70)
plt.ylim(0,70)
plt.title('Grafica tiempo/intensidad')
plt.show()
Я это протестировал с документом (в который я позвонил datos.xlsx), сделанным в LibreOffice и сохраняемым с форматом .xlsx Excel, потому что я не имею в руку excel [^_^]. У документа есть 4 колонны (1 со стоимостью x и 3 со стоимостью y) с выдуманными данными:
0 2 4 6 1 4 8 12 2 6 12 18 3 8 16 24 4 10 20 30 5 12 24 36 6 14 28 42 7 16 32 48 8 18 36 54 9 20 40 60 10 22 44 66 11 24 48 72 12 26 52 78 13 28 56 84 14 30 60 90 15 32 64 96 16 34 68 102 17 36 72 108 18 38 76 114 19 40 80 120 20 42 84 126 21 44 88 132 22 46 92 138 23 48 96 144 24 50 100 150 25 52 104 156 26 54 108 162 27 56 112 168 28 58 116 174 29 60 120 180 30 62 124 196
С этим и используя Пайтон 3.5.2 выходит у меня этот такой уродливый график:
Одинокий пример, что я надеюсь, что он подает тебя чего-то. Я по крайней мере открыл openpyxl, если в будущем я не нуждаюсь в чем-либо подобном никогда эта больше :)
P.D: чтобы загружать соответствующий лист в линии
sheet1 = wb.get_sheet_by_name('Hoja1')
Мы нуждаемся в имени листа (Hoja1 в моем случае). Ты можешь получать имя всех листов xlsx следующей формы:
print(wb.get_sheet_names())
Измененная, чтобы осветлять сомнение, выраженное в комментариях:
Если в первой линии у нас будут этикетки, которые они показывают, что они содержат каждую колонну, и мы хотим, чтобы они появились в легенде графика, будет достаточно начинать читать со второй линии данные и читать lugo листа ячейку, соответствующую имени каждой колонны перемещая это его как признак 'label' в matplotlib.pyplot Например для данных о форме:
t Datos 1 Datos 2 Datos 3 0 2 4 6 1 4 8 12 2 6 12 18 3 8 16 24
Код siguente реализует график используя как этикетки 'Данные 1', 'Данные 2' и 'Данные 3':
from itertools import cycle
from openpyxl import load_workbook
import numpy as np
import matplotlib.pyplot as plt
#cargamos el xlsx en memoria
wb = load_workbook('datos.xlsx', data_only=True)
#cargamos la hoja
sheet1 = wb.get_sheet_by_name('Hoja1')
#creamos dos arreglos en numpy para guardar las 'x' y las 'y'
matriz = np.zeros((sheet1.max_row, sheet1.max_column))
#leemos la hoja columna por columna y vamos guardando los valores 'x' e 'y'
for i in range(1,sheet1.max_row):
for j in range(0,sheet1.max_column):
matriz[i,j]=sheet1.cell(row=i+1, column=j+1).value
#creamos el grafico
colors = cycle(["aqua", "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "purple", "red", "silver", "teal", "yellow"])
plt.xlabel('tiempo')
plt.ylabel('intensidad')
for y in range(1, sheet1.max_column):
plt.plot(matriz[:,0],matriz[:,y], label=sheet1.cell(row=1, column=y+1).value,color=next(colors))
plt.legend(loc='upper left', fontsize='small')
plt.grid(True)
plt.xlim(0,70)
plt.ylim(0,70)
plt.title('Grafica tiempo/intensidad')
plt.show()
Дай ему беглый взгляд также xlwings
Он позволяет объединять книжные магазины Пайтона (numpy, scipy, matplotlib, и т.д.) кроме того, что заменяет VBA на функции, в которые ты веришь в Пайтоне.
В частности, для проблемы, которую ты выдвигаешь: http://docs.xlwings.org/en/stable/matplotlib.html
Лучшее и более практический состоит в том, чтобы использовать библиотека панд. Создай файл excel с характеристиками, которые ты поместил в твой вопрос, libro1.xlsx (два culumnas одно из времени и другая instensidad).
Потом остается код внизу
import pandas as pd
# defines el camino donde esta tu archivo de excel
filename = '/camino/libro1.xlsx'
# lectura del archivo excel usando la función pd.read_excel
dataframe = pd.read_excel(filename)
print dataframe.head() # esto te imprime los primeros 5 elementos
tiempo intensidad
0 1 132
1 2 34
2 3 543
3 4 453
4 5 654
уже для plotear твои данные достаточно использовать библиотеку matplotlib, здесь пример
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(dataframe['tiempo'], dataframe['intensidad'])
plt.show()
я могу рекомендовать тебе, что он увидел этот модуль Пайтона. xlsxwriter Функционируй с почти всеми версиями Пайтона, 2.5, 2.6, 2.7, 3.1, 3.2, 3.3, 3.4, 3.5, Jython and PyPy. И с Excel 2007 в дальнейшем. Кроме того на главной странице есть очень хорошие примеры.
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_line.xlsx')
worksheet = workbook.add_worksheet()
# Add the worksheet data to be plotted.
data = [10, 40, 50, 20, 10, 50]
worksheet.write_column('A1', data)
# Create a new chart object.
chart = workbook.add_chart({'type': 'line'})
# Add a series to the chart.
chart.add_series({'values': '=Sheet1!$A$1:$A$6'})
# Insert the chart into the worksheet.
worksheet.insert_chart('C1', chart)
workbook.close()