写在前面
文章重新写了,因为大部分的示例在
https://gallery.pyecharts.org/#/README
都可以找到,所以优先去官网查吧,我只放一些自己在官网找不到的。
安装pyecharts我就不说了,就说一句如果是内网使用之前先想办法自行下载echarts.min.js文件到内网,然后在Bar(init_opts=opts.InitOpts(js_host=“C:\xxx\”))#这里路径为echarts.min.js所在文件夹即可,后面不再写了。
三维数据气泡图
我的诉求是一个三维数据,横坐标、纵坐标、气泡的大小分别是三组不同的数据,找了全网都没有找到我想要的气泡图,用AI写出来的代码也是完全不顶用,终于在https://gallery.pyecharts.org/#/Dataset/dataset_bar_1找到了一点端倪,然后改了一下。
from pyecharts.charts import Scatter
from pyecharts import options as opts
c = (
Scatter()
.add_dataset(
source=[
["金额", "时间", "价格"],
[300, "2023/3/31", 6.8612],
[300, "2023/3/31", 6.8562],
[500, "2023/4/7", 6.8707],
[250, "2023/4/14", 6.8521],
[300, "2023/4/14", 6.8386],
[300, "2023/4/14", 6.8501],
[150, "2023/4/17", 6.8717],
[300, "2023/4/17", 6.8713],
[300, "2023/7/14", 7.1378],
[300, "2023/7/25", 7.1449],
[200, "2023/11/7", 7.288],
[200, "2023/11/7", 7.288],
[200, "2023/11/17", 7.2403],
[200, "2023/11/17", 7.2428],
]
)
.add_yaxis(
series_name="交易(元)",
y_axis=[],
encode={"x": "时间", "y": "价格"},
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(type_="time"),#注意是time不是datetime
yaxis_opts=opts.AxisOpts(type_="category"),
visualmap_opts=opts.VisualMapOpts(
type_="size",
min_=150,
max_=500,
dimension=0,
pos_left="right",
),
)
)
c.render_notebook()
三维气泡图qstock
最近找到一个很好用的三维气泡图的库,应该是市面上最好用的气泡图了,其他的图因为无法编辑参数和叠加被我放弃了,有兴趣的可以自己去qstock的公众号自己看https://mp.weixin.qq.com/s/zmY4gsPDQ6xDDpC-fVBUPg,话不多说上代码。
import pandas as pd
data = pd.read_excel("D:\\XXX\\XX情况.xlsx")
from qstock import plot
import qstock as qs
plot.scatter(data, x="时间", y="价格", size="金额", title="2022-2023年交易(万元)",)
scatter(data=None, x=None, y=None, title=None, color=None,
size=None,trend=None, legend=True, marginal_x=None, marginal_y=None)
参数说明:
color根据不同类型显示不同颜色;
size根据值大小显示散点图的大小;
trend='ols’添加回归拟合线;
marginal_x=‘violin’,添加小提琴图;
marginal_y= ‘box’,添加箱线图。
标签显示百分比
这个百分比的显示也让我一顿好找,文档都太不友好了。
import pandas as pd
df = pd.read_excel("D:\\预算执行情况.xlsx", sheet_name="预算执行表")
df1 = df.fillna(0)
tb1 = df1.pivot_table(
index="大类",
values=[
"01月差异率",
"02月差异率",
"03月差异率",
"04月差异率",
"05月差异率",
"06月差异率",
"07月差异率",
"08月差异率",
"09月差异率",
"10月差异率",
"11月差异率",
],
aggfunc="sum",
).T
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode
c = (
Line()
.add_xaxis(tb1.index.to_list())
.add_yaxis("经营类小计", tb1["经营类小计"].round(4), is_step=True)
.set_global_opts(title_opts=opts.TitleOpts(title="经营类整体预算差异"))
.set_series_opts(
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode(
"function(x){return Number(x.data[1] * 100).toFixed() + '%';}"
),
)
)
)
c.render_notebook()
柱状图和线图的组合,并且实现正负值显示不用的颜色
算是一个比较综合的图了,基本上满足常规的数据需要,这种柱状和线图的组合还是挺常用的,为什么excel里就这么简单就出来了呢?就很无语。
import pandas as pd
df = pd.read_excel("D:\\预算执行情况.xlsx", sheet_name="预算执行表")
df1 = df.fillna(0)
tb1 = df1.pivot_table(
index="大类",
values=[
"01月差异",
"02月差异",
"03月差异",
"04月差异",
"05月差异",
"06月差异",
"07月差异",
"08月差异",
"09月差异",
"10月差异",
"11月差异",
],
aggfunc="sum",
).T
import pyecharts.options as opts
from pyecharts.charts import Line, Bar
from pyecharts.commons.utils import JsCode
color_function = """
function (params) {
if (params.value < 0) {
return 'rgb(97, 160, 168, 0.7)';
} else if (params.value > 0) {
return 'rgb(194, 53, 49, 0.7)';
}
return 'rgb(97, 160, 168, 0.7)';
}
"""
line = (
Line()
.set_global_opts(
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(
type_="value",
is_scale="True",
),
legend_opts=opts.LegendOpts(
pos_top="bottom",
), # 图例置底,图例的
)
.add_xaxis(xaxis_data=tb1.index.to_list())
.add_yaxis(
series_name="经营类收入差异",
y_axis=tb1["经营类收入"].round(0),
label_opts=opts.LabelOpts(is_show=True),
)
.add_yaxis(
series_name="经营类支出差异",
y_axis=-tb1["经营类支出"].round(0),
label_opts=opts.LabelOpts(is_show=True),
)
)
bar = (
Bar()
.set_global_opts(
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(
type_="value",
is_scale="True",
),
legend_opts=opts.LegendOpts(
pos_top="bottom",
), # 图例置底,图例的
)
.add_xaxis(tb1.index.to_list())
.add_yaxis(
series_name="经营类合计差异",
y_axis=tb1["经营类小计"].round(0).tolist(),
itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)),
)
)
overlap = line.overlap(bar)
overlap.render_notebook()