本文所使用的语言为Python,所使用的可视化module为pyecharts。数据源为iFinD数据接口。
建议使用脚本的朋友:
1、可以将Python版本更新到Python 3.7及以上;
2、使用 pip install pyecharts安装pyecharts;
3、点此申请iFinD数据接口的试用,并安装相关模块即可使用
--------------代码分界线---------------
from example.commons import Collector, Faker
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Page, Scatter
from decimal import Decimal
from iFinDPy import *
C = Collector()
#输入数据接口的账号密码
THS_iFinDLogin('请输入ifind数据接口账号','请输入ifind数据接口密码')
#开始日期
start_date = "1950-08-01"
#结束日期
end_date = "2019-08-21"
#指标说明
#M002902560 0-14
#M002902562 15-64
#M002902564 65+
a = THS_EDBQuery('M002902560;M002902562;M002902564',start_date, end_date)
#从iFinD终端获得时间序列
x_axis_list = a['tables'][1]['time']
x_axis_list.reverse()
#分别从iFinD数据终端获得
#0-14岁人口
#15-64岁人口
#65岁以上人口
v1 = a['tables'][0]['value']
v2 = a['tables'][1]['value']
v3 = a['tables'][2]['value']
v1.reverse()
v2.reverse()
v3.reverse()
#将所有人口调整成亿人
i = 0
while i < len(v1):
v1[i] = v1[i]/10000
v2[i] = v2[i]/10000
v3[i] = v3[i]/10000
i += 1
#计算老龄化比率,并且控制数值为2位小数
#将年份用两位数字显示
v4 = list()
new_x_axis_list = list()
i = 0
while i < len(v1):
total_pop = v1[i]+v2[i]+v3[i]
v4.append(Decimal(v3[i]/total_pop).quantize(Decimal('0.0000'))*100)
new_x_axis_list.append(x_axis_list[i][2:4])
i += 1
x_axis_list = new_x_axis_list
@C.funcs
def overlap_bar_line() -> Line:
#生成折线图
line = (
Line()
.add_xaxis(x_axis_list)
.add_yaxis("老龄化人口比率",
v4,
linestyle_opts=opts.LineStyleOpts(color="Crimson", width=3, type_="solid"),
itemstyle_opts=opts.ItemStyleOpts(border_width=1,color="Crimson"),
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(name="18年老龄化人口比例", coord=[x_axis_list[30], v4[30]], value="12%"),opts.MarkPointItem(name="18年老龄化人口比例", coord=[x_axis_list[12], v4[12]], value="7%")]
),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=7, name="进入老龄化社会"),opts.MarkLineItem(y=14, name="进入老龄社会")]),
)
.extend_axis(
yaxis=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value}亿"),name="(中国人口数量/亿)"
),
)
.set_series_opts(
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value}"),max_=20,min_=0,interval=5,
name="(万人)"
),
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="中国人口结构图:iFinD EDB"),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value}%"),max_=20,min_=0,interval=5,
name="(老龄化人口比率/%)"
),
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value}年"),
),
)
)
bar = (
Bar()
.add_xaxis(x_axis_list)
.add_yaxis("0-14岁", v1,stack=True,yaxis_index=1,itemstyle_opts=opts.ItemStyleOpts(color="SteelBlue"))
.add_yaxis("15-64岁", v2,stack=True,yaxis_index=1,itemstyle_opts=opts.ItemStyleOpts(color="DeepSkyBlue"))
.add_yaxis("65岁以上", v3,stack=True,yaxis_index=1,itemstyle_opts=opts.ItemStyleOpts(color="SkyBlue"))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
line.overlap(bar)
return line
Page().add(*[fn() for fn, _ in C.charts]).render()
--------------代码分界线---------------
关注“核新同花顺iFinD”公众号(微信号:ths_iFinD),获取更多价值数据分析!