Изображать данные о листе графически excel с Пайтоном

Вы хотели сделать график данных, которые у меня есть в excel используя python. В первой колонне excel у меня есть значения времени (ось x), и в других колоннах значения inensidad (ось y) для каждого времени.

Поскольку я прочитал, я могу использовать openpyxel, чтобы читать excel. Потом я представляю, что происходить ты оценил их в матрицу numpy, и потом делать график с matplotlib.

Не, если я это выдвигаю хорошо.

Вы могли бы говорить мне, играло ли роль это так? Маленький пример был бы великолепным!

2
задан 07.10.2016, 13:43
4 ответа

Я довожу до сведения, что никогда он не использовал 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 выходит у меня этот такой уродливый график: Grafica

Одинокий пример, что я надеюсь, что он подает тебя чего-то. Я по крайней мере открыл 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()
3
ответ дан 24.11.2019, 13:11
  • 1
    FJSevilla, функционирует гениально, much и # 237; пропасти спасибо!! Два cositas: 1) В легенде грамма и # 225; fico он появляется у меня, как который у него есть данные о 999 колоннах; и #191; я est и # 225; вычисляя все колонны, которые может давать лист excel?. 2), Чтобы завивать немного завиток, если в первой линии у меня есть слова идентифицируя, что является каждой колонной, и #191; я могу способствовать тому, чтобы каждый identificativo колонны появился в легенде? (меньше слово, которое соответствует первой колонне, которая является временем и - ось x). Большое спасибо! – Rg111 07.10.2016, 14:31
  • 2
    Относительно первого сомнения в моем случае он не происходит, только читает колонны, которые содержат что-то и пустые не колонны, если он перемещает что-то тебя, есть различный в твоем документе exel. Как coment и # 233; никогда я не использовал Openpyxl и возможно, что он убегает от меня немного, не имея файла, который ты используешь, не говорить тебе прямо сейчас, что он происходит. То, что ты можешь делать, если ты знаешь число колонн, просто меняться sheet1.max_column из-за этого числа. – FJSevilla 07.10.2016, 15:00
  • 3
    Относительно второй, если у него есть f и # 225; cil soluci и # 243; n, просто начни читать данные, чтобы хранить в array с линии 2 и не с один и потом создав грамм и # 225; fico ты перемещаешь его в параметр label соответствующую стоимость читая ячейку .xlsx. Я буду изменять ответ в и # 241; adiendo в конце самой этот consideraci и # 243; n. – FJSevilla 07.10.2016, 15:31
  • 4
    Гениальный! Функционируй совершенно! Меня вновь не переместило то, что он комментировал в первом сомнении, туз и # 237; что deb и # 237; делать что-то плохим... Большое спасибо из-за твоей помощи!! – Rg111 07.10.2016, 16:27

Дай ему беглый взгляд также xlwings

Он позволяет объединять книжные магазины Пайтона (numpy, scipy, matplotlib, и т.д.) кроме того, что заменяет VBA на функции, в которые ты веришь в Пайтоне.

В частности, для проблемы, которую ты выдвигаешь: http://docs.xlwings.org/en/stable/matplotlib.html

0
ответ дан 30.10.2019, 06:25
  • 1
    Спасибо! Не conoc и # 237; в, он, сделанный беглый взгляд! – Rg111 17.10.2016, 03:16

Лучшее и более практический состоит в том, чтобы использовать библиотека панд. Создай файл excel с характеристиками, которые ты поместил в твой вопрос, libro1.xlsx (два culumnas одно из времени и другая instensidad).

introducir la descripción de la imagen aquí

Потом остается код внизу

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

introducir la descripción de la imagen aquí

1
ответ дан 24.11.2019, 13:11
  • 1
    Гениальный!! Другой пользователь уже hab и # 237; в прокомментированный, что с Пандами pod и # 237; чтобы приносить пользу, но не hab и # 237; в enido время смотрения этого... Большое спасибо из-за c и # 243; я говорю, функционируй очень хорошо. – Rg111 17.10.2016, 13:15
  • 2
    Ничего, если ответ пошел, и #250; til хороший давать стрелу достигает, чтобы способствовать ответом. – nandhos 18.10.2016, 16:07
  • 3
    Если, он d и # 237;! Но у меня есть менее 15 точек reputaci и # 243; n и он не появляется как помеченный, хотя выходит сообщение и помещает, что он остается зарегистрированным. Я сожалею о том, что не могу способствовать с другой формы до этого необыкновенного ответа, s и # 243; это благодарить тебя снова. – Rg111 18.10.2016, 19:32

я могу рекомендовать тебе, что он увидел этот модуль Пайтона. 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()

introducir la descripción de la imagen aquí

0
ответ дан 24.11.2019, 13:11
  • 1
    Спасибо! Очень интересный, он, сделанный беглый взгляд! – Rg111 17.10.2016, 13:16