Ugrás a fő tartalomra

Python excel diagram létrehozása







 

Az adatelemzéseknél az excell kimenet a preferált. Itt már az is szempont, hogy a megfelelően formázott táblázatos eredmények mellé a diagramok is odakerüljenek.

Ezt lehet python csomagból létrehozás vagy az excel funkcionalitásból generálás is. Ekkor nem kell külön egyéb csomag, csak a külső meghívás paraméterezésének  ismerete kell és a pandas csomag


Több módszer is lehet tehát most csak az alábbi kettőt emelem ki:

  • Pandas és matplotlib csomaggal diagram generálás és képfile be mentés majd excelbe töltés
  • Pandas csomaggal excel diagram generálás

Excel és pandas objektumok

pandas          Excel
DataFrame   worksheet
Series           column
Index            row headings
row               row
NaN              empty cell



Az excelből generált eset rugalmasabb mivel ilyenkor a formázási lehetőség teljes tárháza rendelkezésre áll:




Hogyan néz ki egy ilyen kód:

## Diagram generállás közvetlenül excelből
import pandas as pd
import numpy as np

## adat generálás
data = pd.DataFrame(
    {'A': [np.random.uniform(0.1*i, 0.1*i + 1) for i in range(100)],
     'B': [np.random.uniform(0.1*i, 0.1*i + 1) for i in range(100)]}
)

## pandas excel beállítások
excel_file = r'c:\Users\User\Downloads\kl_plot2.xlsx'
sheet_name = 'Munka1'
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
data.to_excel(writer, sheet_name=sheet_name)

## excel munkafuzet munkalap beállítás
workbook = writer.book
worksheet = writer.sheets[sheet_name]

## autószűrős
max_row = global_num.shape[0]
max_col = 3
worksheet.set_column(0,  max_col - 1, 12)
worksheet.autofilter(0, 0, max_row, max_col - 1)


## diagram előkészítés
chart = workbook.add_chart({'type': 'scatter'})

## sor és oszlop generálás/töltés (táblázat)
max_row = len(data)
col_x = data.columns.get_loc('A') + 1
col_y = data.columns.get_loc('B') + 1

## diagram feltöltés
chart.add_series({
    'name':       "Samples",
    'categories': [sheet_name, 1, col_x, max_row, col_x],
    'values':     [sheet_name, 1, col_y, max_row, col_y],
    'marker':     {'type': 'circle', 'size': 4},
    'trendline': {'type': 'linear'},
})

## felíratok elkészítése
chart.set_x_axis({'name': 'Concentration'})
chart.set_y_axis({'name': 'Measured',
                  'major_gridlines': {'visible': False}})

## diagra beszúrás D2 cellába
worksheet.insert_chart('D2', chart)

## mentés és lezárás
writer.save()
writer.handles.close()










A képként beillesztett diagram sokkal szűkösebben szerkeszthető tovább:




Hogyan néz ki egy ilyen kód:

#diagram generálás matplotlib-ből és beszúrás
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import (
                               FormatStrFormatter, 
                               AutoMinorLocator,
                               FuncFormatter,
                               )

import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from pandas.plotting import register_matplotlib_converters

# https://github.com/CSSEGISandData/COVID-19
df = pd.read_csv(r'c:\Users\User\Downloads\time_series_covid19_confirmed_global.csv')
df = df[df["Country/Region"] == 'Hungary']                ## magyarországra szűrés

df = df.iloc[:,4:]                                        ## első 5 oszlop kihagyása            

global_num = df.sum()
global_num.filter(like='2/22')

result = global_num.filter(like = '/1/22' and  '/2/22')
print(result)

# global_num['kldate1'] = pd.to_datetime(global_num.index)  

print (global_num.index[0] )

global_num.index.name = 'date'
#global_num.to_frame(name='date').query('date >= "2022-01-01"').reset_index()   

print (global_num.head() )

fig, ax = plt.subplots()
ax.set(title  = 'Hungary Covid Confirmed Cases',
       xlabel = 'Time',
       ylabel = 'Number of cases')

## formázások
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: format(x/1000000) +'M'))

date_form = DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(date_form)
locator = mdates.DayLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=3))
ax.yaxis.grid()

dates = pd.to_datetime(global_num.index)

## diagram előállítása
plt.plot(dates, global_num)
plt.savefig(r'c:\Users\User\Downloads\kl_plot.png')    ## generált diagram mentés kép állományba
plt.show()

## diagram kép xls-be beszúrás
writer = pd.ExcelWriter(r'c:\Users\User\Downloads\kl_plot1.xlsx', engine = 'xlsxwriter')
global_num.to_excel(writer, sheet_name='Munka1')


## autószűrős
workbook  = writer.book
worksheet = writer.sheets['Munka1']
max_row = global_num.shape[0]
max_col = 2
worksheet.set_column(0,  max_col - 1, 12)
worksheet.autofilter(0, 0, max_row, max_col - 1)


worksheet = writer.sheets['Munka1']
worksheet.insert_image('C2', r'c:\Users\User\Downloads\kl_plot.png')

## mentés és lezárás
writer.save()
writer.handles.close()






Pandas csomag






Link:

https://github.com/klajosw/python/blob/master/kl_py_xls_chart.ipynb

Megjegyzések