本文主要講述如何使用Python操作Excel繪製柱形圖。 相關代碼請參考 https://github.com/RustFisher/python playground 本文鏈接:https://www.rustfisher.com/2019/11/19/Python/Python op exce ...
本文主要講述如何使用Python操作Excel繪製柱形圖。
相關代碼請參考 https://github.com/RustFisher/python-playground
本文鏈接:https://www.rustfisher.com/2019/11/19/Python/Python-op-excel_openpyxl_bar_column_chart/
開發工具,環境
- PyCharm
- Python3
- Office Excel
前面我們已經創建好了一張Excel表。
現在我們要根據已有的數據,往裡面添加柱形圖。
柱形圖 BarChart
參考《Python openpyxl Excel繪製柱形圖》得知,我們主要使用BarChart
與BarChart3D
類。
圖表中許多的細節由BarChart屬性控制。
後文都以chart1來表示柱形圖對象 chart1 = BarChart()
。
數據來源範圍 Reference
首先我們應該確定數據的範圍。有數據才好繪圖。這裡使用的是Reference
類來表示數據“引用”範圍。
data1 = Reference(st, min_col=2, min_row=1, max_row=7, max_col=3)
cats1 = Reference(st, min_col=1, min_row=2, max_row=7)
需要註意的是,範圍的下標是從1開始的。
這裡的data1把標題也框進去了。設定數據的時候,需要設置titles_from_data=True
chart1.add_data(data1, titles_from_data=True)
設置種類使用set_categories
方法,也是把一個範圍(Reference)的數據傳入。
chart1.set_categories(cats1)
柱子方向控制 type
方向由屬性type
來控制,有2個可選參數:bar
表示橫向,col
表示豎直。
chart1.type = "bar" # 橫向柱形圖
chart1.type = "col" # 縱向柱形圖
標題 title
屬性title控制標題。如果置為None則不顯示標題。
圖表的標題 chart1.title = "日均值對比"
坐標的標題,首先需要拿到x,y的坐標。
chart1.y_axis.title = '數值'
chart1.x_axis.title = st.cell(column=1, row=1).value # 直接用單元格的內容做標題
添加圖表
add_chart將圖表添加到sheet中。圖表的左上角對齊某個單元格。下麵是對齊A8。
st.add_chart(chart1, 'A8')
3D柱形圖 BarChart3D
柱子的形狀 shape
預設是立方體,但也可以從下麵的形狀里選一個。
{'box', 'pyramid', 'pyramidToMax', 'coneToMax', 'cone', 'cylinder'}
chart1.type = 'cone'
box 是立方體,中規中矩。
pyramid 是金字塔,頂部也是尖的。
cone 是圓錐,看起來很尖銳。
cylinder 是圓柱。
配色風格 style
style 會影響圖表的配色風格,一般用10比較多彩多樣。
代碼示例
繪製圖表用的數據來自運營的Python指南 - Python 操作Excel。
我們在已有的表格中添加柱形圖。代碼參考python-playground - Github
繪製2D柱形圖
def create_bar_chart_1(file_path):
"""
插入柱形圖
:param file_path: Excel 文件路徑
:return: None
"""
wb = load_workbook(file_path)
st = wb.active
data1 = Reference(st, min_col=2, min_row=1, max_row=7, max_col=3)
cats1 = Reference(st, min_col=1, min_row=2, max_row=7)
chart1 = BarChart()
chart1.type = "col"
chart1.style = 9
chart1.title = "日均值對比"
# chart1.y_axis.title = '數值'
chart1.x_axis.title = st.cell(column=1, row=1).value
chart1.add_data(data1, titles_from_data=True)
chart1.set_categories(cats1)
chart1.shape = 0
st.add_chart(chart1, 'A8')
wb.save(file_path)
繪製3D柱形圖
def create_bar_chart_2(file_path):
"""
插入3D柱形圖
:param file_path: Excel 文件路徑
:return: None
"""
wb = load_workbook(file_path)
st = wb.active
data1 = Reference(st, min_col=2, min_row=1, max_row=7, max_col=3)
cats1 = Reference(st, min_col=1, min_row=2, max_row=7)
chart1 = BarChart3D()
chart1.type = "bar"
chart1.style = 10
chart1.title = "日均值對比"
chart1.x_axis.title = None
chart1.shape = 'cylinder'
chart1.add_data(data1, titles_from_data=True)
chart1.set_categories(cats1)
st.add_chart(chart1, 'A26')
wb.save(file_path)
運行結果示例圖片