openpyxl_chart_demos(openpyxl三:图表相关操作:创建图表、使用轴、图表布局)

"""
openpyxl_chart_demos.py

(openpyxl三:图表相关操作:创建图表、使用轴、图表布局)

使用:
创建图表:
openpyxl.chart.Reference(), Chart.add_data(), Worksheet.add_chart();

使用轴:
Chart.title / style / x_axis.title / y_axis.title, 
Chart.x_axis.scaling.min, 
Chart.x_axis.Scaling.max, 

openpyxl.chart.Series(), Chart.series.appedn(Series), Chart.append(Series),
Chart.x_axis.scaling.logBase

Chart.x_axis.scaling.orientation

Chart.y_axis.crosses, Chart.y_axis.majorGridlines
Chart1 + Chart2

图表布局:
openpyxl.chart.layout.Layout(): 为手动布局对象ManualLayout(),
openpyxl.chart.layout.ManualLayout():为Lyaout()类的参数,
Chart.layout,
Chart.legend.position;


"""


import openpyxl
from openpyxl import Workbook, load_workbook
from openpyxl.chart import (AreaChart,           #AreaChart面积图表(2D区域图)
                            AreaChart3D,         #AreaChart面积图表(3D区域图)
                            
                            BarChart,            #BarChart条形图/柱形图/成交量图
                            
                            BubbleChart,         #BubbleChart气泡图
                            LineChart,           #LineChart折线图
                            LineChart3D,         #LineChart3D折线图
                            ScatterChart,        #ScatterChart散点图
                            PieChart,            #PieChart饼图
                            PieChart3D,          #PieChart3D饼图3D
                            ProjectedPieChart,   #ProjectedPieChart投影饼图
                            
                            StockChart,          #StockChart股票图
                            
                            Reference,           #用来对单元范围进行标准化引用
                            Series)              #用来方便创建图表数据系列
from copy import deepcopy                        #深层复制
from openpyxl.chart.axis import DateAxis         #时间轴
from openpyxl.chart.series import DataPoint      #
from openpyxl.chart.layout import (Layout,       #布局
                                   ManualLayout  #手动布局
                                   )




wb = Workbook()
wb_filename = r'openpyxl_cases\openpyxl_chart_demos_case1.xlsx'


####################  图表类型
#参考文件 openpyxl_chart_type_demos.py


####################  创建图表
#图表至少由一系列一个或多个数据点组成。系列本身由对单元格范围的引用组成。

#####
#使用:openpyxl.chart.Reference(worksheet=None, min_col=None, min_row=None, max_col=None, max_row=None, range_string=None)
#来对单元范围进行标准化引用。

#使用:Chart.add_data() 来给图表添加系列数据。
#使用:Worksheet.add_chart() 来给工作表添加图表 至 指定cell位置。

#注意:使用Worksheet.append()方法添加的内容必须为 序列类型。
ws_cjtb = wb.create_sheet('创建图表', index=0)
for i in range(10):
    ws_cjtb.append([i])         

chart = BarChart()
values = Reference(ws_cjtb, min_col=1, min_row=1, max_col=1, max_row=10)
chart.add_data(values)
ws_cjtb.add_chart(chart)        #如果不指定参数2锚定单元格,则默认在'E15'位置插入图表。


####################  使用轴


##### 设置轴线的 最小值 和 最大值

#####
#使用:Chart.title  属性 来赋值添加 图表标题
#使用:Chart.style  属性 来赋值设置 图表样式
#使用:Chart.x_axis.title 属性 来赋值添加 X轴标题
#使用:Chart.y_axis.title 属性 来赋值添加 y轴标题

#使用:Chart.x_axis.scaling.min  属性 来赋值X轴的最小值
#使用:Chart.x_axis.scaling.max  属性 来赋值X轴的最大值
#使用:Chart.y_axis.scaling.min  属性 来赋值Y轴的最小值
#使用:Chart.y_axis.scaling.max  属性 来赋值Y轴的最大值

ws_zxzxdz = wb.create_sheet('轴线最小大值', index=0)
ws_zxzxdz.append(['X', '1/X'])
for x in range(-10, 11):
    if x:
        ws_zxzxdz.append([x, 1.0 / x])

chart1 = ScatterChart()
chart1.title = "Full Axes"
chart1.x_axis.title = 'x'
chart1.y_axis.title = '1/x'
chart1.legend = None

chart2 = ScatterChart()
chart2.title = "Clipped Axes"
chart2.x_axis.title = 'x'
chart2.y_axis.title = '1/x'
chart2.legend = None

chart2.x_axis.scaling.min = 0        #设置X轴的最小值
chart2.y_axis.scaling.min = 0        #设置Y轴的最小值
chart2.x_axis.scaling.max = 11       #设置X轴的最大值
chart2.y_axis.scaling.max = 1.5      #设置Y轴的最大值

#####
#使用:openpyxl.chart.Series(values, xvalues=None, zvalues=None, title=None, title_from_data=False)
#来方便创建图表数据系列
#参数values       : 指定 y轴值
#参数xvalues=None : 指定 x轴值
#参数zvalues=None : 指定 大小
#参数title=None   : 指定图表的系列标题 

#使用:Chart.series.append(Series) 方法来添加 经过Series类 方便创建的气泡图表数据系列。
#等同于 Chart.append(Series)
#使用:Chart.series 属性 来获取所有数据系列值。

x = Reference(ws_zxzxdz, min_col=1, min_row=2, max_row=22)
y = Reference(ws_zxzxdz, min_col=2, min_row=2, max_row=22)
s = Series(y, xvalues=x)
chart1.series.append(s)
chart2.series.append(s)

ws_zxzxdz.add_chart(chart1, "C1")
ws_zxzxdz.add_chart(chart2, "C20")


##### 设置轴线 按倍数显示
#####
#使用:内置函数enumerate(序列) 来将参数序列组合成一个 索引序列。

#使用:Chart.x_axis.scaling.logBase  属性 来进行X轴的数字倍数显示
#使用:Chart.y_axis.scaling.logBase  属性 来进行Y轴的数字倍数显示
#注意:如果对X轴按数字倍数比例显示,则X轴域中的负值将被丢弃。

import math
ws_zxbsxs = wb.create_sheet('轴线倍数显示', index=0)
ws_zxbsxs.append(['X', 'Gaussian'])
for i, x in enumerate(range(-10, 11)):  #使用:内置函数enumerate(序列) 来将参数序列组合成一个 索引序列。
    ws_zxbsxs.append([x, '=EXP(-(($A${row}/6)^2))'.format(row= i+2)])
    
chart1 = ScatterChart()
chart1.title = 'No Scaling'
chart1.x_axis.title = 'X'
chart1.y_axis.title = 'Y'
chart1.legend = None

chart2 = ScatterChart()
chart2.title = 'X Log Scale'
chart2.x_axis.title = 'X (log10)'
chart2.y_axis.title = 'Y'
chart2.legend = None
chart2.x_axis.scaling.logBase = 2    #设置 X轴线 按数字倍数显示

chart3 = ScatterChart()
chart3.title = 'Y Log Scale'
chart3.x_axis.title = 'X'
chart3.y_axis.title = 'Y (log10)'
chart3.legend = None
chart3.y_axis.scaling.logBase = 10   #设置 X轴线 按数字倍数显示

chart4 = ScatterChart()
chart4.title = 'Both Log Scale'
chart4.x_axis.title = 'X (log10)'
chart4.y_axis.title = 'Y (log10)'
chart4.legend = None
chart4.x_axis.scaling.logBase = 10   #设置 X轴线 按数字倍数显示
chart4.y_axis.scaling.logBase = 10   #设置 X轴线 按数字倍数显示

chart5 = ScatterChart()
chart5.title = 'Log Scale Base e'
chart5.x_axis.title = 'X (ln)'
chart5.y_axis.title = 'Y (ln)'
chart5.legend = None
chart5.x_axis.scaling.logBase = math.e    #math.e 表示一个常量。
chart5.y_axis.scaling.logBase = math.e    #设置 X轴线 按 math.e常量 的倍数显示

x = Reference(ws_zxbsxs, min_col=1, min_row=2, max_row=22)
y = Reference(ws_zxbsxs, min_col=2, min_row=2, max_row=22)
s = Series(y, xvalues=x)
chart1.append(s)
chart2.append(s)
chart3.append(s)
chart4.append(s)
chart5.append(s)

ws_zxbsxs.add_chart(chart1,'C1')
ws_zxbsxs.add_chart(chart2,'K1')
ws_zxbsxs.add_chart(chart3,'C18')
ws_zxbsxs.add_chart(chart4,'K18')
ws_zxbsxs.add_chart(chart5,'F35')


##### 设置轴线的方向
#轴可以“正常”显示或反向显示。
#轴方向由比例orientation属性控制,该属性的值可以 'minMax'为法向或'maxMin'反向。

#####
#使用:Chart.x_axis.scaling.orientation 属性 来指定轴方向从小到大minMax / 从大到小maxMin

ws_zxfx = wb.create_sheet('轴线方向', 0)
ws_zxfx['A1'] = 'Archimedean Spiral'
ws_zxfx.append(['T', 'X', 'Y'])
for i, t in enumerate(range(100)):
    ws_zxfx.append([t/16.0, '=$A${row}*COS($A${row})'.format(row= i+3),
                            '=$A${row}*SIN($A${row})'.format(row= i+3)])

chart1 = ScatterChart()
chart1.title = 'Default Orientation'
chart1.x_axis.title = 'X'
chart1.y_axis.title = 'Y'
chart1.legend = None

chart2 = ScatterChart()
chart2.title = 'Flip X'
chart2.x_axis.title = 'X'
chart2.y_axis.title = 'Y'
chart2.legend = None
chart2.x_axis.scaling.orientation = 'maxMin'    #设置X轴线防线 从大到小
chart2.y_axis.scaling.orientation = 'minMax'    #设置Y轴线方向 从小到大

chart3 = ScatterChart()
chart3.title = 'Flip Y'
chart3.x_axis.title = 'X'
chart3.y_axis.title = 'Y'
chart3.legend = None
chart3.x_axis.scaling.orientation = 'minMax'    #设置轴线方向 从小到大
chart3.y_axis.scaling.orientation = 'maxMin'    #设置轴线方向 从大到小

chart4 = ScatterChart()
chart4.title = 'Flip Both'
chart4.x_axis.title = 'X'
chart4.y_axis.title = 'Y'
chart4.legend = None
chart4.x_axis.scaling.orientation = 'maxMin'    #设置轴线方向 从大到小
chart4.y_axis.scaling.orientation = 'maxMin'    #设置轴线防线 从大到小

x = Reference(ws_zxfx, min_col=2, min_row=2, max_row=102)
y = Reference(ws_zxfx, min_col=3, min_row=2, max_row=102)
s = Series(y, xvalues=x)
chart1.append(s)
chart2.append(s)
chart3.append(s)
chart4.append(s)

ws_zxfx.add_chart(chart1, 'D1')
ws_zxfx.add_chart(chart2, 'L1')
ws_zxfx.add_chart(chart3, 'D18')
ws_zxfx.add_chart(chart4, 'L18')


##### 添加轴线
#添加第二个轴,实际上就是 创建一个只有Y轴,且与第一个图标共享X轴的第二个图表。

#####
#使用:Chart.y_axis.crosses = 'max' 属性 来设置在右侧显示图表的Y轴,将其设置为最大横过X轴。
#使用:Chart.y_axis.majorGridlines = None 来设置网格线。
#使用:Chart1 + Chart2  方式 来添加第二个轴线,如:柱状图 + 折线图。

ws_tjzx = wb.create_sheet('添加轴线', 0)
rows = [
        ['Aliens', 2, 3, 4, 5, 6, 7],
        ['Humans', 10, 40, 50, 20, 10, 50]
       ]
for row in rows:
    ws_tjzx.append(row)

c1 = BarChart()      #第一个图表,柱状线。
c1.title = 'Survey results'
c1.x_axis.title = '1 Days'
c1.y_axis.title = '1 Aliens'
c1.y_axis.majorGridlines = None                           #设置Y轴网格线 
v1 = Reference(ws_tjzx, min_col=1, max_col=7, min_row=1)  #引用第一行的所有数据
c1.add_data(v1, titles_from_data=True, from_rows=True)

c2 = LineChart()     #第二个图标,折线图表。
c2.y_axis.title = '2 Humans'
c2.y_axis.axId = 200
v2 = Reference(ws_tjzx, min_col=1, max_col=7, min_row=2)  #引用第二行的所有数据
c2.add_data(v2, titles_from_data=True, from_rows=True)

c1.y_axis.crosses = 'max'  #在右侧显示图表的y轴,将其设置为最大横过x轴
c1 += c2                   #使用:Chart1 + Chart2  方式 来添加第二个轴线,如:柱状图 + 折线图。



ws_tjzx.add_chart(c1, 'D4')



####################  图表布局


##### 图表布局 和 图例布局

#使用:openpyxl.chart.layout.Layout(self, manualLayout=None, extLst=None) 类
#来创建布局对象。
#参数manualLayout: 为手动布局对象ManualLayout()

#使用:openpyxl.chart.layout.ManualLayout(self, layoutTarget=None, 
#xMode=None, yMode=None, wMode='factor', hMode='factor', 
#x=None, y=None, w=None, h=None, extLst=None) 类 
#来创建 手动布局对象。
#参数x,y: 指定位置
#参数h,w: 指定大小

#使用:Chart.layout 属性 来赋值 设置布局为 创建的手动布局对象。
#使用:Chart.legend.position 属性 来设置图例的位置:r,l,t,b,tr,分别代表:右、左、顶、底、右上。


ws_tbbj = wb.create_sheet('图表布局', 0)
rows = [
        ['Size', 'Batch 1', 'Batch 2'],
        [2, 40, 30],
        [3, 40, 25],
        [4, 50, 30],
        [5, 30, 25],
        [6, 25, 35],
        [7, 20, 40]
       ]
for row in rows:
    ws_tbbj.append(row)

ch1 = ScatterChart()
xvalues = Reference(ws_tbbj, min_col=1, min_row=2, max_row=7)
for i in range(2,4):
    values = Reference(ws_tbbj, min_col=i, min_row=1, max_row=7)
    series = Series(values, xvalues, title_from_data=True)
    ch1.series.append(series)

#散点图表1
ch1.title = 'Default layout'
ch1.style = 13
ch1.x_axis.title = 'Size'
ch1.y_axis.title = 'Percentage'
ch1.legend.position = 'r'          #设置图例的位置:r,l,t,b,tr,分别代表:右、左、顶、底、右上。
ws_tbbj.add_chart(ch1, 'B10')


#散点图表2
ch2 = deepcopy(ch1)
ch2.title = 'Manual chart layout'
ch2.legend.position = 'tr'        #设置图例的位置:右上
ch2.layout = Layout(manualLayout = ManualLayout(x=0.25, y=0.25,    #x,y调整位置
                                                h=0.5, w=0.5       #h,w调整大小
                                                ))   
ws_tbbj.add_chart(ch2, 'K10')


#散点图表3
ch3 = deepcopy(ch1)
ch3.title = 'Manual chart layou, edge mode'
ch3.layout = Layout(ManualLayout(x=0.25, y=0.25,    #x,y调整位置
                                 h=0.5, w=0.5,      #h,w调整大小
                                 xMode='edge', 
                                 yMode='edge'
                                 ))
ws_tbbj.add_chart(ch3, 'B27')


#单点图表4
ch4 = deepcopy(ch1)
ch4.title = 'Manual legend layout'
ch4.legend.layout = Layout(manualLayout = ManualLayout(x=0, y=0.9,     #x,y调整位置
                                                       h=0.1, w=0.5,   #h,w调整大小
                                                       xMode='edge',   
                                                       yMode='edge'
                                                       ))
ws_tbbj.add_chart(ch4, 'K27')





wb.save(wb_filename)









  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: illd_tc2xx_demos是基于英飞凌公司开发的工具集成体ILLD (Infineon Low Level Driver)的一种示例代码集合,可在英飞凌的32位TriCore™芯片上运行。这些示例代码主要包括了常见的应用,如CAN通信、PWM输出、ADC采集等。使用者可以通过对这些示例代码的学习和修改,快速了解TriCore™芯片的使用方法,加深对ILLD工具集成体的理解。 ILLD是英飞凌公司独立开发的底层驱动,提供了硬件驱动抽象层、操作系统接口层等多种API供上层应用调用,大大简化了应用编程者的工作量。ILLD与TriCore™芯片充分结合,提供高效、稳定的底层驱动服务,为用户的应用提供稳定的运行环境。 TriCore™芯片是英飞凌公司专为汽车电子领域开发的一种32位微处理器。其高性能、低功耗、可靠性强等优点,使其在汽车电子控制器领域得到广泛的应用。ILLD_tc2xx_demos中提供的示例代码,涉及了TriCore™芯片的多个模块以及ILLD工具集成体的多个功能,可以有效的帮助用户快速上手TriCore™芯片和ILLD的使用。 总之,ILLD_tc2xx_demos是一种实用的示例代码集合,对于TriCore™芯片和ILLD工具集成体的使用有很好的帮助作用。通过学习和运用这些示例代码,用户可以提高开发效率,快速完成应用程序的开发,为汽车电子等领域的控制器开发提供支持。 ### 回答2: illd_tc2xx_demos是一组用于TriCore® 2xx系列微控制器的演示程序。这些演示程序涵盖了许多TC2xx器件的不同方面,包括CAN和LIN通信,ADC和PWM驱动,以及多种不同的外设和传感器的集成。这些演示程序可用于展示TriCore® 2xx系列微控制器的许多功能和性能,并可用于帮助开发者调试和优化TC2xx应用程序。 illd_tc2xx_demos是作为Infineon公司的TriCore® 2xx系列微控制器的集成开发环境(IDE)和软件包的一部分提供的。这些IDE和软件包为开发者提供了一个全面的工具链,可用于设计,开发和优化TC2xx应用程序。除了illd_tc2xx_demos之外,这些IDE和软件包还包括用于代码生成,仿真和调试的工具,以及针对特定应用的软件库和示例代码。 整个软件包旨在使开发者能够快速轻松地利用TriCore® 2xx系列微控制器的功能和性能。通过使用illd_tc2xx_demos,开发者可以学习如何利用TC2xx的不同特性来满足他们的应用需求,并避免需要从头开始编写代码来实现这些功能。因此,illd_tc2xx_demos是TC2xx应用程序设计和开发的重要资源。 ### 回答3: illd_tc2xx_demos是一系列使用INFINEON的TC2xx芯片开发的示例程序集合。TC2xx芯片是基于AURIX架构的高性能汽车控制芯片,拥有强大的计算性能和丰富的外设接口。 illd_tc2xx_demos提供了多个示例程序,包含了各种常见的汽车控制应用场景。其中包括CAN总线通信、外设控制、数据转换、自动驾驶、安全行车等多个应用领域。 这些示例程序往往是基于具体的硬件平台和软件库开发的,并且经过了充分的测试和验证。因此,使用这些示例程序可以帮助开发者快速了解和掌握汽车控制领域的相关技术和应用,并且可以在实际项目开发中奠定良好的基础。 值得一提的是,illd_tc2xx_demos不仅仅是给初学者使用的,对于有一定经验的开发者来说,通过阅读和修改这些示例程序,还可以深入理解汽车控制技术的工作原理和实现方式,并且可以快速开发自己的实际项目。 综上所述,illd_tc2xx_demos是一款非常有用的示例程序集合,对于研究和开发汽车控制领域的技术人员来说,具有非常重要的意义。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值