多图“预警”(一)
本文作者:钱梦璇
文字编辑:孙晓玲
技术总编:张 邯
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~
层叠多图指的是将多种类型的图展现在一个图中,一般常见的是将柱状图和线图同时显示在一张图表中,举个例子:
1.读取数据(利用pandas读入excel中指定列)
import pandas as pd
data=pd.read_excel("房地产数据.xlsx")
print("获取到所有的值:\n{0}".format(data)) #格式化输出
#读取所有行的指定列
year=data.loc[:,'年份'] #loc是轴标签
GDP=data.loc[:,"人均GDP"]
area=data.loc[:,"商品房销售面积(万平方米)"]
数据如下:
通过loc轴标签来定位之后用到的三列数据。将year作为横坐标,GDP和area作为纵坐标。由于横坐标的取值不能用数值型数据来表示,需要将数值型转化为字符串。
year=data.loc[:,'年份']
a=list(year)
b=[]
for i in a:
b.append(str(i))
print(b)
生成的横坐标数据如下:
2.绘制层叠多图Overlap
from pyecharts.charts import Bar,Line
from pyecharts import options as opts
def overlap_line_scatter():
bar = (
Bar()
.add_xaxis(b)
.add_yaxis("人均GDP",list(GDP))
.add_yaxis("商品房销售面积(万平方米)",list(area))
.set_global_opts(title_opts=opts.TitleOpts(title="层叠多图1"))
)
line = (
Line()
.add_xaxis(b)
.add_yaxis("人均GDP",list(GDP))
.add_yaxis("商品房销售面积(万平方米)",list(area))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
bar.overlap(line)
return bar
overlap_line_scatter().render(r'E:\层叠多图1.html')
分别设置两个图表的格式,关键的一步bar.overlap(line)将bar和line层叠在一起。图形如下所示:
3.绘制层叠多图Overlap—双y轴
from pyecharts.charts import Bar,Line
from pyecharts import options as opts
def overlap_bar_line():
bar=(
Bar()
.add_xaxis(["4月","5月","6月","7月","8月","9月"])
.add_yaxis("蒸发量",[27,28,75,130,169,29])
.add_yaxis("降雨量",[28,29,70,175,45])
.extend_axis( #平均温度 (第2个y轴)
yaxis=opts.AxisOpts(
#坐标轴标签配置项 interval表示坐标轴刻度标签的显示间隔-设置为5,表示隔5个标签显示一个标签 即 0,5,10,15...
axislabel_opts=opts.LabelOpts(formatter="{value} ℃"),interval=5) #格式化刻度名称
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #不显示柱状图上的数字标签
.set_global_opts(
title_opts=opts.TitleOpts(title="层叠多图2-双y轴"),
yaxis_opts=opts.AxisOpts( #第1个y轴
axislabel_opts=opts.LabelOpts(formatter="{value} ml"))
)
)
line = Line().add_xaxis(["4月","5月","6月","7月","8月","9月"]).add_yaxis("平均温度",[4.5,6.3,10.2,20.3,23.4,23], yaxis_index=1) #yaxis_index=1表示在右侧的y轴上的标记刻度
bar.overlap(line)
return bar
overlap_bar_line().render(r'E:\层叠多图2-双y轴.html')
extend_axis()就是对图形右侧y轴的设定,这里的数据为平均温度。axislabel_opts是坐标轴标签配置项,属于坐标轴配置项AxisOpts中的设定,它的特殊之处就是需要标签配置项LabelOpts来设定;格式化设置formatter将右侧y轴的标签设定为“数值+ ℃”,interval表示刻度标签的显示间隔为5,即0,5,10,15…这样的显示形式。
区别于上述extend_axis()的设定,在全局配置项中对yaxis_opts的设定对应的是图形左侧y轴,也就是一般情况下的设定。同样的,将标签设定为“数值+ ml”。
线图Line中yaxis_index=1指的是在右侧y轴上的标记刻度,如果删去这一项,右侧y轴不会显示刻度,而线图上的点对应的是左侧y轴的刻度。
图形如下:
(二)组合图表(并行多图)
组合图表指的是将多种类型的图同时渲染,关键之处在于标题、图例、网格的位置设定。
1.上下布局
用之前《陈情令》的数据:
from pyecharts.charts import Bar,Line,Grid
from pyecharts import options as opts
from pyecharts.globals import ThemeType #引入主题
def grid_vertical():
bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(["魏无羡","蓝忘机","江澄","温情","江厌离","温宁","金陵","蓝思追","薛洋","金光瑶"]) #加入横坐标参数
bar.add_yaxis("角色热度占比(百分数)",[33.3,15.8,11.8,8.3,7.2,6.5,5.9,1.8,1.7,1.6],category_gap = "35%") #加入纵坐标参数,category_gap为柱之间的距离
bar.set_global_opts(title_opts=opts.TitleOpts(title = "《陈情令》角色热度占比",subtitle = "2019.06.27-2019.08.15")
,legend_opts=opts.LegendOpts(pos_top="10%"))
line=Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
line.add_xaxis(["魏无羡","蓝忘机","江澄","温情","江厌离","温宁","金陵","蓝思追","薛洋","金光瑶"]) #加入横坐标参数
line.add_yaxis("角色好评率(百分数)",[87.0,84.7,72.1,68.2,73.2,85.2,68.6,69.4,50.1,45.9])
line.set_global_opts(title_opts=opts.TitleOpts(title = "《陈情令》角色好评率",pos_top="50%")
,legend_opts=opts.LegendOpts(pos_top="50%"))
grid=(
Grid()
.add(bar,grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(line,grid_opts=opts.GridOpts(pos_top="60%"))
)
return grid
grid_vertical().render(r'E:\python小组学习\pyecharts学习\组合图表-并行多图-上下布局.html')
对比bar和line图的设定,第一个需要注意的是图例位置的设定,bar图图例pos_top="10%"距离容器上方10%,line图图例pos_top="50%"距离容器上方50%;第二个注意的是标题位置的设定,同样的line图标题距离容器上方50%。
GridOpts是直角坐标系网格配置项,设定了两个图的位置。以上的设定,将bar和line图上下排列渲染在容器中。
图形如下:
2.左右布局
主要还是标题、图例、网格的位置设定。
from pyecharts.charts import Bar,Line,Grid
from pyecharts import options as opts
from pyecharts.globals import ThemeType #引入主题
def grid_horizontal():
bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(["魏无羡","蓝忘机","江澄","温情","江厌离","温宁","金陵","蓝思追","薛洋","金光瑶"])
bar.add_yaxis("角色热度占比(百分数)",[33.3,15.8,11.8,8.3,7.2,6.5,5.9,1.8,1.7,1.6],category_gap = "35%") #加入纵坐标参数,category_gap为柱之间的距离
bar.set_global_opts(title_opts=opts.TitleOpts(title = "《陈情令》角色热度占比",pos_left="20%")
,legend_opts=opts.LegendOpts(pos_left="20%",pos_top="8%"))
line=Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
line.add_xaxis(["魏无羡","蓝忘机","江澄","温情","江厌离","温宁","金陵","蓝思追","薛洋","金光瑶"])
line.add_yaxis("角色好评率(百分数)",[87.0,84.7,72.1,68.2,73.2,85.2,68.6,69.4,50.1,45.9])
line.set_global_opts(title_opts=opts.TitleOpts(title = "《陈情令》角色好评率",pos_right="20%")
,legend_opts=opts.LegendOpts(pos_right="15%",pos_top="8%"))
grid=(
Grid()
.add(bar,grid_opts=opts.GridOpts(pos_right="60%"))
.add(line,grid_opts=opts.GridOpts(pos_left="60%"))
)
return grid
grid_horizontal().render(r'E:\组合图表-并行多图-左右布局.html')
上下布局通过pos_top和pos_bottom设置,左右布局通过pos_right和pos_left设置。图形如下:
3.多y轴
用到的配置项很多,需要清楚每个配置项怎么用,哪些配置项也可以在另一个配置项里面设置,需要消化。代码分开解读,每段不是完整的,不能运行出来,连在一起才可渲染:
from pyecharts.charts import Bar,Line,Grid
from pyecharts import options as opts
x_data = ["{}月".format(i) for i in range(1, 13)]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis(
"蒸发量",
[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
color="#FFA07A", #在网上查找了每个color对应的颜色,可以自行更改
)
.add_yaxis(
"降水量",
[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
color="#5793f3",
)
以上只是简单地输入横坐标与纵坐标的数据。其中,color的设定是RGB形式。
.extend_axis(
#AxisOpts是坐标轴配置项。
yaxis=opts.AxisOpts(
name="蒸发量",
type_="value",
min_=0,
max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#FFA07A")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="温度",
min_=0,
max_=25,
position="left",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
这一部分添加了两个y轴,其中AxisOpts是坐标轴配置项,name对应添加这两个y轴的名称,type_=”value”设定坐标轴的类型为数值轴,对于“蒸发量”这一y轴,position设置它的位置在右侧,“温度”对应的y轴在左侧,之后对“降水量”的设定也在右侧。AxisLineOpts为坐标轴刻度线配置项,这里设置的颜色与对于柱状图和线图的颜色是一样的。
在“温度”y轴的设置中,SplitLineOpts分割线配置项中又通过LineStyleOpts线风格配置项设定的分割线的透明度为1(opacity=1),当取值为0时,也就不显示分割线了。
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="降水量",
min_=0,
max_=250,
position="right",
offset=80,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
),
title_opts=opts.TitleOpts(title="Grid-多 Y 轴示例"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
这一部分设置了“降水量”这一y轴,与上述不同的是,offset=80表示y轴相对于默认位置的偏移,在相同的position上有多个y轴的时候会用到。所以,渲染的图形中,右侧的蒸发量和降水量不是重叠的,是并排的。TooltipOpts提示框配置项设定trigger触发类型为“axis”坐标轴触发,axis_pointer_type指示器类是“cross”十字准星指示器。也就是,当鼠标在图形上滑动时,会出现十字线而且有提示框出现。
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"平均温度",
[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
yaxis_index=2,
color="#675bba",
label_opts=opts.LabelOpts(is_show=False),
)
)
bar.overlap(line)
grid=Grid()
grid.add(bar,opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
grid.render_notebook()
最后一部分将线图层叠在柱状图上方,由于一共有3个y轴,而平均温度这个y轴的索引为2,yaxis_index=2。GridOpts中的is_control_axis_index表示是否由自己控制Axis索引,如果为false,线图将根据右边的y轴刻度来画折线。
“气功”研究哪家强
数据长、宽整型之另辟蹊径
10分钟带你走进宝藏数据库BvD
给你一个贴心的reshape应用
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。