下面是详细讲解"Flask使用Pyecharts在单个页面展示多个图表的方法"的完整攻略,包含两条示例说明:
概述
Pyecharts提供了一种简单的方式展示图表,它基于Echarts,提供类似Python的API。使用Pyecharts生成单个图表很容易,但如果需要在一个页面上展示多个图表时,可能就需要一些额外的处理。本攻略将介绍使用Flask和Pyecharts在单个页面上展示多个图表的方法。
准备工作:
- Python3.x
- Flask
- Pyecharts
示例1:在一个页面上展示多个图表
我们将使用Flask和Pyecharts库在一个页面上展示多个图表。为了简化示例,我们将展示两个图表,一个是柱状图,一个是折线图。
首先,安装Flask和Pyecharts库:
pip install flask
pip install pyecharts
然后,创建一个名为'app.py'的文件,添加以下代码:
from flask import Flask, render_template
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
app = Flask(__name__)
@app.route("/")
def index():
bar = (
Bar()
.add_xaxis(["A", "B", "C", "D", "E"])
.add_yaxis("bar", [5, 20, 36, 10, 75])
.set_global_opts(title_opts=opts.TitleOpts(title="Bar Chart"))
)
line = (
Line()
.add_xaxis(["A", "B", "C", "D", "E"])
.add_yaxis("line", [15, 30, 20, 45, 70])
.set_global_opts(title_opts=opts.TitleOpts(title="Line Chart"))
)
return render_template("index.html", bar=bar.render_embed(), line=line.render_embed())
if __name__ == "__main__":
app.run()
这段代码将创建两个图表:一个柱状图和一个折线图。然后,通过render_embed()方法将这两个图表渲染为HTML片段,最后通过render_template()方法将这两个HTML片段渲染到index.html文件。
接下来,创建一个名为'index.html'的文件,添加以下代码:
<!DOCTYPE html>
<html>
<head>
<title>Multiple Charts</title>
</head>
<body>
{{bar|safe}}
{{line|safe}}
</body>
</html>
这段代码将在网页上显示两个图表。
运行一下这个Flask应用程序,然后打开"http://127.0.0.1:5000/"即可在一个页面上看到两个图表。
示例2:对多个图表进行交互操作
这个示例将展示如何对多个图表进行交互操作。我们将展示两个图表,当鼠标移到某个点上时,另一个图表将同时更新显示相关数据。
和上一个例子一样,我们需要先安装Flask和Pyecharts库。
然后,创建一个名为'app.py'的文件,添加以下代码:
from flask import Flask, render_template
from pyecharts import options as opts
from pyecharts.charts import Scatter
app = Flask(__name__, static_folder="templates")
@app.route("/")
def index():
data = [
[10.0, 8.04, 10.0, 9.14, 'I'],
[8.0, 6.95, 8.0, 8.14, 'II'],
[13.0, 7.58, 13.0, 8.74, 'III'],
[9.0, 8.81, 9.0, 8.77, 'IV'],
[11.0, 8.33, 11.0, 9.26, 'V'],
[14.0, 9.96, 14.0, 8.10, 'VI'],
[6.0, 7.24, 6.0, 6.13, 'VII'],
[4.0, 4.26, 4.0, 3.10, 'VIII'],
[12.0, 10.84, 12.0, 9.13, 'IX'],
[7.0, 4.82, 7.0, 7.26, 'X'],
[5.0, 5.68, 5.0, 4.74, 'XI']
]
hover_js = """function (params) {
$.post("/position", {x:params.data[0], y:params.data[1]}, function(data) {
$('#line').html(data);
});
}"""
scatter = (
Scatter()
.add_xaxis([x[0] for x in data])
.add_yaxis("Data", [x[1] for x in data], label_opts=opts.LabelOpts(formatter='{b}'))
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter Chart"),
toolbox_opts=opts.ToolboxOpts(),
tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross', formatter='{c}'),
)
.set_series_opts(
label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})")
)
.set_colors(['#DA70D6'])
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})"))
.set_global_opts(title_opts=opts.TitleOpts(title="Scatter Chart"))
)
line = (
Scatter()
.add_xaxis([x[2] for x in data])
.add_yaxis("Data", [x[3] for x in data])
.set_global_opts(
title_opts=opts.TitleOpts(title="Line Chart"),
toolbox_opts=opts.ToolboxOpts(),
tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross')
)
.set_series_opts(
label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})")
)
.set_colors(['#7FFF00'])
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})"))
.set_global_opts(title_opts=opts.TitleOpts(title="Scatter Chart"))
)
scatter.on("mouseover", hover_js)
return render_template("index.html", scatter=scatter.render_embed(), line=line.render_embed())
@app.route("/position", methods=["POST"])
def position():
x = float(request.form.get("x"))
y = float(request.form.get("y"))
data = [
[10, y * 0.5 + 3, 10, 9.14],
[8, y * 0.5 + 3, 8, 8.14],
[13, y * 0.5 + 3, 13, 8.74],
[9, y * 0.5 + 3, 9, 8.77],
[11, y * 0.5 + 3, 11, 9.26],
[14, y * 0.5 + 3, 14, 8.10],
[6, y * 0.5 + 3, 6, 6.13],
[4, y * 0.5 + 3, 4, 3.10],
[12, y * 0.5 + 3, 12, 9.13],
[7, y * 0.5 + 3, 7, 7.26],
[5, y * 0.5 + 3, 5, 4.74]
]
line = (
Scatter()
.add_xaxis([x[2] for x in data])
.add_yaxis("Data", [x[3] for x in data])
.set_global_opts(
title_opts=opts.TitleOpts(title="Line Chart"),
toolbox_opts=opts.ToolboxOpts(),
tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross')
)
.set_series_opts(
label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})")
)
.set_colors(['#7FFF00'])
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}'),
itemstyle_opts=opts.ItemStyleOpts(),
tooltip_opts=opts.TooltipOpts(formatter="({c})"))
.set_global_opts(title_opts=opts.TitleOpts(title="Scatter Chart"))
)
return line.render_embed()
if __name__ == "__main__":
app.run()
这里我们用Pyecharts的Scatter()组件创建了两个图表,一个散点图和一个折线图。用到的数据是经典的端点数据集。
在这个示例中,我们加入了一个hover_js方法,这个方法会在数据点上鼠标移动时调用。它将数据点作为参数传递给"position"路由。在"position"路由中,我们使用传递的数据点创建一个新的折线图,并将它使用render_embed()方法渲染为HTML片段。然后,我们将HTML片段作为响应返回到JavaScript代码中,以便在网页上显示更新后的折线图。
最后,创建一个名为'index.html'的文件,添加以下代码:
<!DOCTYPE html>
<html>
<head>
<title>Interactive Charts</title>
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<div id="scatter" style="width:800px;height:400px;"></div>
<div id="line" style="width:800px;height:400px;"></div>
{{scatter|safe}}
{{line|safe}}
</body>
</html>
这里,我们创建了两个div容器,分别用于显示散点图和折线图,然后将渲染的HTML片段插入到div容器中。
运行一下这个Flask应用程序,然后打开"http://127.0.0.1:5000/",鼠标移到散点图上的某个点上,折线图将会随之更新,实现了两个图表的交互。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask使用Pyecharts在单个页面展示多个图表的方法 - Python技术站