下面我会详细讲解“python利用json和pyecharts画折线图实例代码”的完整攻略。
准备工作
在开始编写代码之前,我们需要先安装必要的库。具体步骤可以参照以下操作:
pip install pyecharts
pip install requests
pip install lxml
pip install pandas
这些库的作用如下:
- pyecharts:数据可视化库,用于绘制折线图。
- requests:爬虫库,用于获取网页信息。
- lxml:数据处理库,用于解析网页信息。
- pandas:数据处理库,用于对数据进行处理。
数据获取
在绘制折线图之前,我们需要先获取数据。我们以 “当日疫情” 数据为例。以下是获取数据的详细步骤:
import requests
import json
def get_data():
"""
:return: response:返回请求数据
"""
url = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
response = requests.get(url).json()["data"]
data = json.loads(response)
return data
在上述代码中,我们使用 requests 库向指定的网址发送请求。接着我们使用 json 库将请求的字符串转换成字典格式。
数据清洗
通过上述代码获取的数据是一个比较复杂的字典,我们需要将其清洗成适合绘制折线图的数据格式。以下是数据清洗的详细步骤:
def wash_data(data):
"""
:param data: 传入数据字典
:return: time_list:返回时间列表
total_data:返回累计数据列表
add_data:返回每日新增数据列表
"""
# 获取时间列表
time_list = []
for i in data["chinaDayList"]:
time_list.append(i["date"][:4] + "/" + i["date"][4:6] + "/" + i["date"][6:])
# 获取累计数据列表和每日新增数据列表
total_data = []
add_data = []
for i in data["chinaDayList"]:
total_data.append(i["confirm"])
add_data.append(i["confirmAdd"])
return time_list, total_data, add_data
在上述代码中,我们分别获取时间、累计数据、每日新增数据等信息。通过数据的清洗,我们可以获取到适合绘制折线图的数据格式。
绘制折线图
在获取到适合绘制折线图的数据后,我们需要使用 pyecharts 库将其绘制成图表。以下是绘制折线图的详细步骤:
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.charts import Line
def draw_line(time_list, total_data, add_data):
"""
:param time_list: 传入时间列表
total_data: 传入累计数据列表
add_data:传入每日新增数据列表
:return: 生成折线图
"""
# 创建 Line 类对象
line = Line()
# 配置时间轴
line.add_xaxis(time_list)
# 配置累计数据轴
line.add_yaxis(
"累计确诊",
total_data,
linestyle_opts=opts.LineStyleOpts(width=2, color="#8B636C", type_="dashed"),
label_opts=opts.LabelOpts(is_show=False),
)
# 配置每日新增数据轴
line.add_yaxis(
"每日新增",
add_data,
linestyle_opts=opts.LineStyleOpts(width=2, color="#00CED1", type_="dashed"),
label_opts=opts.LabelOpts(is_show=False),
)
# 配置图表组件
line.set_series_opts(
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(name="", y=total_data[-1])]
),
label_opts=opts.LabelOpts(is_show=False),
)
line.set_global_opts(
title_opts=opts.TitleOpts(title="当日疫情"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
xaxis_opts=opts.AxisOpts(type_="category", split_number=5),
yaxis_opts=opts.AxisOpts(
split_number=3,
axislabel_opts=opts.LabelOpts(formatter=JsCode("function(value) {return value + '人';}")),
),
legend_opts=opts.LegendOpts(pos_bottom=True),
)
return line.render("line_chart.html")
在上述代码中,我们使用 pyecharts 库绘制折线图。其中,Line() 类用于创建一个折线图,add_xaxis() 方法用于配置横轴,add_yaxis() 方法用于配置纵轴,set_series_opts() 方法用于配置折线标记,set_globao_opts() 用于配置全局标记等等。
示例
以下是一个实例代码,其绘制了同一城市中每个时间点的天气状况。
import requests
import json
from pyecharts import options as opts
from pyecharts.charts import Line
# 获取数据的函数
def get_data():
url = "http://www.sojson.com/open/api/weather/json.shtml?city=杭州"
response = requests.get(url).json()
return response
# 清洗数据的函数
def wash_data(data):
time_list = [i["date"] for i in data["data"]["forecast"]]
high_list = [i["high"] for i in data["data"]["forecast"]]
low_list = [i["low"] for i in data["data"]["forecast"]]
return time_list, high_list, low_list
# 绘制折线图的函数
def draw_line(time_list, high_list, low_list):
# 创建 Line 类对象
line = Line()
# 配置时间轴
line.add_xaxis(time_list)
# 配置横轴、纵轴1
line.add_yaxis("最高温度", high_list)
line.set_global_opts(xaxis_opts=opts.AxisOpts(name="日期"), yaxis_opts=opts.AxisOpts(
name="Temperature (°C)"))
# 配置纵轴2
line.extend_axis(
yaxis=opts.AxisOpts(
name="最低温度",
type_="value",
min_=0,
max_=40,
position="right",
axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
)
)
# 添加纵轴的数值
line.add_yaxis(
"最低温度",
low_list,
yaxis_index=1,
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(width=3, color="#3285c7", type_="dashed"),
)
# 配置全局属性
line.set_global_opts(
title_opts=opts.TitleOpts(title="杭州每日天气"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
legend_opts=opts.LegendOpts(is_show=True),
)
return line.render("line_chart.html")
# 主函数
def main():
data = get_data()
time_list, high_list, low_list = wash_data(data)
draw_line(time_list, high_list, low_list)
if __name__ == "__main__":
main()
以上代码使用了 pyecharts 库,绘制了杭州每日天气的折线图。具体细节可以详细查看上述代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python利用json和pyecharts画折线图实例代码 - Python技术站