要想图表美观,除了配色渲染外,图表的样式和布局也很重要。样式指的是图表元素以什么样的形式呈现,比如是否加图框、绘图区背景怎么设置、坐标轴上是否显示刻度线、是否显示网格等。布局指的是图表中图形元素怎么摆放、它们之间的间隔等。布局需要遵守一些基本的审美原则,如留白、主次、疏密和取舍等。[大谦Excel,dqexcel点com]
Excel图表的内置样式
Excel可以创建近百种图表类型,对于每种图表类型,Excel内置了多种图表样式,通过简单的设置,可以将当前绘制的图表修改为指定样式。
通过编程绘图时,每种内置样式有自己的编号和名称。对当前绘制的图表使用指定编号或名称的样式就可以快速进行修改。下面创建复合线形图,给它应用不同的内置样式。完整代码见:Samples->ch04 美化Excel图表->25 设置图表的样式->py.py。
root=os.getcwd() #获取当前工作路径
app=xw.App(visible=True,add_book=False) #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False) #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1') #获取指定工作表对象
sht.api.Range('A2:C11').Select() #数据
cht1=sht.api.Shapes.AddChart2(228,xw.constants.ChartType.xlLine,10,20,350,250,True).Chart
cht2=sht.api.Shapes.AddChart2(230,xw.constants.ChartType.xlLine,20,20,350,250,True).Chart
cht3=sht.api.Shapes.AddChart2(232,xw.constants.ChartType.xlLine,30,20,350,250,True).Chart
cht4=sht.api.Shapes.AddChart2(233,xw.constants.ChartType.xlLine,40,20,350,250,True).Chart
运行代码生成图1-35。
图1-35 对复合线形图使用内置样式
下面创建复合柱状图,给它应用不同的内置样式。完整代码见:Samples->ch04 美化Excel图表->26 设置图表的样式2->py.py。
root=os.getcwd() #获取当前工作路径
app=xw.App(visible=True,add_book=False) #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False) #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1') #获取指定工作表对象
sht.api.Range('A2:C11').Select() #数据
cht1=sht.api.Shapes.AddChart2(205,xw.constants.ChartType.xlColumnClustered,\
10,20,350,250,True).Chart
cht2=sht.api.Shapes.AddChart2(202,xw.constants.ChartType.xlColumnClustered,\
20,20,350,250,True).Chart
cht3=sht.api.Shapes.AddChart2(208,xw.constants.ChartType.xlColumnClustered,\
30,20,350,250,True).Chart
cht4=sht.api.Shapes.AddChart2(209,xw.constants.ChartType.xlColumnClustered,\
40,20,350,250,True).Chart
运行代码生成图1-36。
图1-36 对复合柱状图使用内置样式
自定义样式
除了使用Excel内置的样式外,还可以自定义样式。Excel默认图表样式偏商业图表或工作型图表,需要自己定义适合科研图表的图表样式。
本书的示例代码中,绝大多数代码都有一个set_style函数,使用该函数给当前图表自定义样式。下面的代码定义并使用set_style函数实现自定义图表样式。完整代码见:Samples->ch04 美化Excel图表->27 自定义图表样式->py.py。
import xlwings as xw #导入xlwings包
import os #导入OS包
def set_style(cht) #设置样式:
cht.ChartArea.Format.Line.Visible=False #图表区外框不可见
cht.PlotArea.Format.Fill.Visible=False #绘图区区域不可见
cht.PlotArea.Format.Line.Visible=True #绘图区外框可见
cht.PlotArea.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200)) #外框颜色
ax1=cht.Axes(1) #获取横轴
ax2=cht.Axes(2) #获取纵轴
ax1.HasTitle=True #显示横轴标题
ax1.AxisTitle.Text='Categories' #横轴标题文本内容
ax1.AxisTitle.Font.Size=10 #横轴标题文本字体大小
ax1.TickLabels.Font.Size=8 #横轴刻度标签字体大小
#ax1.TickLabels.NumberFormat='0.00' #横轴刻度标签显示格式
ax1.HasMajorGridlines=True #显示横轴主网格线
ax2.HasTitle=True #显示纵轴标题
ax2.AxisTitle.Text='Values' #纵轴标题文本内容
ax2.AxisTitle.Font.Size=10 #纵轴标题文本字体大小
ax2.TickLabels.Font.Size=8 #纵轴刻度标签字体大小
ax2.HasMajorGridlines=True #显示纵轴主网格线
cht.HasTitle=True #显示图表标题
#cht.ChartTitle.Caption='Plot' #图表标题文本内容
#cht.ChartTitle.Font.Size=12 #图表标题文本字体大小
root=os.getcwd() #获取当前工作路径
app=xw.App(visible=True,add_book=False) #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False) #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1') #获取指定工作表对象
sht.api.Range('A2:C8').Select() #数据
shp=sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,20,20,350,250,True)
cht=shp.Chart #获取图表
cht.SeriesCollection(1).ChartType=xw.constants.ChartType.xlLine #序列1改为折线图
set_style(cht) #设置样式
运行代码生成图1-37。
图1-37 自定义图表样式
布局章法:留白
人生忌满,绘图亦如是。传统审美认为,不管画画还是书法,甚至文章的排版,内容都不要占满整个稿纸或页面,而是要在四周留出适当的空白。
用Excel绘图时需要注意,除特殊类型的图表外,图表中的图形元素如柱状图的柱面、线形图的折线等不要占满整个绘图区,适当留出一些空白。标注的文字不要太多,特别是不要把绘图区内图表以外的空间占满。。
布局章法:主次
绘图时要把主要的内容放在突出的位置,常犯的错误是,坐标去背景颜色过于醒目,或过于杂乱;图表元素如图例、色条等过大等。要突出图表主体部分,不能让背景、图例、色条和标题等附属部分喧宾夺主。
布局章法:疏密
图表中对象的布局不能过密,也不能过稀。如复合柱状图分组内部柱面之间的距离和分组之间的距离要合适。如果感觉点图、线形图等图表不够饱满,可以添加网格线,添加背景色等。有的期刊对图表有标注字数的要求,要求标注字数不能超过多少字。标注字数太多,或者标注太多,都会影响图表的美观。
布局章法:取舍
绘图时,没有必要把所有信息都添加到图表上。尽管出发点是好的,是希望图表能反映尽可能多的信息。但是当美观和实用起了冲突,需要进行取舍。常见的错误是将很多信息显示在饼图的扇区上,甚至挤满整个扇区。有的图表类型会自动标注图形元素,如果标签过多导致出现重叠时,要考虑只显示部分标签。