Pyecharts是一个用于生成Echarts图表的类库,可以生成各种类型的图表,包括柱状图、折线图、饼图、散点图等。在Pyecharts中,可以使用Grid或者Page对象将多个图表组合在一起。
以下是使用Pyecharts组合图的示例代码:
在这个例子中,我们创建了一个柱状图和一个折线图,并将它们组合在一起。使用Grid对象的add方法将两个图表添加到同一个Grid中,并使用GridOpts对象指定它们的位置。最后,使用render方法将组合图表渲染为一个HTML文件。
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Grid
# 创建数据
x_data = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
y_bar = [120, 200, 150, 80, 70, 110, 130]
y_line = [20, 30, 10, 20, 35, 45, 25]
# 创建柱状图
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("销量", y_bar)
.set_global_opts(title_opts=opts.TitleOpts(title="柱状图"))
)
# 创建折线图
line = (
Line()
.add_xaxis(x_data)
.add_yaxis("点击量", y_line)
.set_global_opts(title_opts=opts.TitleOpts(title="折线图"))
)
# 将柱状图和折线图组合在一起
grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_left="20%")) # 在左侧添加柱状图
.add(line, grid_opts=opts.GridOpts(pos_right="20%")) # 在右侧添加折线图
)
# 渲染图像
grid.render("bar_and_line_combined.html")
实验:
圆环图
from pyecharts import options as opts
from pyecharts.charts import Bar, Page,Line,Pie,Radar,Grid
pie_demo=(
Pie()
.add("",[('20岁以下',2.2),('20-20岁',27.9),
('31-40岁',56.2),('41-50岁',10.9),
('51岁以上',2.8)],center=["20%","80%"],radius=[50,80], label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
.set_global_opts(title_opts=opts.TitleOpts(title="中药材消费者画像",pos_left="15%",pos_top="55%"),
legend_opts=opts.LegendOpts(is_show=False))
)
pie_demo.render_notebook()
堆积图:
from pyecharts import options as opts
from pyecharts.charts import Bar, Page,Line,Pie,Radar,Grid
tick_label=['2019年','2020年','2021年','2022年','2023年']
data1 = [20.3,22.0,23.5,22.5,22.3]
data2 = [79.7,78.0,76.5,77.5,77.7]
bar=(
Bar()
.add_xaxis(tick_label)
.add_yaxis("供应商A",data1,stack="stack1",color=" cyan")
.add_yaxis("供应商B",data2,stack="stack1",color="orange")
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比",pos_left="20%",pos_top="5%"),
legend_opts=opts.LegendOpts(is_show=False))
)
bar.render_notebook()
雷达图:
from pyecharts import options as opts
from pyecharts.charts import Bar, Page,Line,Pie,Radar,Grid
data=[[33,45,3,9,10]]
c_schema = [
{"name": "化学药", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "中成药", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "生物制品", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "中药饮片", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "保健品", "max": 50, "min": 0, "color": 'black', "font_size": 18}
]
c = (
Radar()
.set_colors(["#4587E7"])
.add_schema(
schema=c_schema,
shape="circle",
center=["50%", "50%"],
radius="80%",
angleaxis_opts=opts.AngleAxisOpts(
start_angle=90,
min_=0,
max_=360,
is_clockwise=False,
interval=5,
axistick_opts=opts.AxisTickOpts(is_show=False),
axislabel_opts=opts.LabelOpts(is_show=False),
axisline_opts=opts.AxisLineOpts(is_show=False),
splitline_opts=opts.SplitLineOpts(is_show=False),
),
radiusaxis_opts=opts.RadiusAxisOpts(
min_=0,
max_=50,
interval=10,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
polar_opts=opts.PolarOpts(),
splitarea_opt=opts.SplitAreaOpts(is_show=False),
splitline_opt=opts.SplitLineOpts(is_show=False),
)
.add(
series_name="全国药店药品销售额占比",
data=data,
areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
linestyle_opts=opts.LineStyleOpts(width=2),
)
)
c.render_notebook()
组合图:
from pyecharts import options as opts
from pyecharts.charts import Bar, Page,Line,Pie,Radar,Grid
bar = Bar(init_opts=opts.InitOpts(width='2000px',height='800px'))
x_data = ['2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021']
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis(
"蒸发量",
[87430,90912,96225,101885,107147,116390,105764,120215],
yaxis_index=0,
z=0,
color="orange", #稍微修改下颜色
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="同比增速(%)",
name_location="center",
name_gap=30,
min_=-20,
max_=20,
axislabel_opts=opts.LabelOpts(font_size=14),
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="blank")
),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts(
yaxis_opts=opts.AxisOpts(
name="诊疗量(万人次)",#我们删除了降水保留了蒸发,这里改为蒸发量
name_location="center",
name_gap=60,
min_=0,
max_=130000,
interval=50000,
axislabel_opts=opts.LabelOpts(font_size=14),
offset=0, #这里是Y轴间距,由80改为0即两个Y轴重合,当然我们已经删除了原来的一个Y轴,所以相当于把第二Y轴左移
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="blank")
),
),
title_opts=opts.TitleOpts(title="2014-2021年中国中医类医疗卫生机构诊疗量",pos_left="center",pos_top="top"),
legend_opts=opts.LegendOpts(pos_left='40%',pos_bottom='89%'),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"同比增速(%)",
[7.40,4.00,5.83,5.81,5.16,8.63,-9.13,13.66],
symbol='triangle',
symbol_size=15,
yaxis_index=1, #删了一个Y轴,Y轴索引由2改为1
color="Magenta",
label_opts=opts.LabelOpts(is_show=False),
)
)
tick_label=['2019年','2020年','2021年','2022年','2023年']
data1 = [20.3,22.0,23.5,22.5,22.3]
data2 = [79.7,78.0,76.5,77.5,77.7]
bar1=(
Bar()
.add_xaxis(tick_label)
.add_yaxis("供应商A",data1,stack="stack1",xaxis_index=1,yaxis_index=2,color=" cyan")
.add_yaxis("供应商B",data2,stack="stack1",xaxis_index=1,yaxis_index=2,color="orange")
.set_global_opts(title_opts=opts.TitleOpts(title="全国药店中药饮片供应商占比",pos_left="40%",pos_top="50%"),
legend_opts=opts.LegendOpts(is_show=False))
)
pie_demo=(
Pie()
.add("",[('20岁以下',2.2),('20-20岁',27.9),
('31-40岁',56.2),('41-50岁',10.9),
('51岁以上',2.8)],center=["20%","80%"],radius=[50,80], label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
.set_global_opts(title_opts=opts.TitleOpts(title="中药材消费者画像",pos_left="15%",pos_top="55%"),
legend_opts=opts.LegendOpts(is_show=False))
)
data=[[33,45,3,9,10]]
c_schema = [
{"name": "化学药", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "中成药", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "生物制品", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "中药饮片", "max": 50, "min": 0, "color": 'black', "font_size": 18},
{"name": "保健品", "max": 50, "min": 0, "color": 'black', "font_size": 18}
]
c = (
Radar()
.set_colors(["#4587E7"])
.add_schema(
schema=c_schema,
shape="circle",
center=["50%", "50%"],
radius="80%",
angleaxis_opts=opts.AngleAxisOpts(
start_angle=90,
min_=0,
max_=360,
is_clockwise=False,
interval=5,
axistick_opts=opts.AxisTickOpts(is_show=False),
axislabel_opts=opts.LabelOpts(is_show=False),
axisline_opts=opts.AxisLineOpts(is_show=False),
splitline_opts=opts.SplitLineOpts(is_show=False),
),
radiusaxis_opts=opts.RadiusAxisOpts(
min_=0,
max_=50,
interval=10,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
polar_opts=opts.PolarOpts(),
splitarea_opt=opts.SplitAreaOpts(is_show=False),
splitline_opt=opts.SplitLineOpts(is_show=False),
)
.add(
series_name="全国药店药品销售额占比",
data=data,
areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
linestyle_opts=opts.LineStyleOpts(width=2),
)
)
barr = bar.overlap(line)
grid=(
Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
.add(barr,grid_opts=opts.GridOpts(pos_bottom="60%"),is_control_axis_index=True)
.add(pie_demo,grid_opts=opts.GridOpts(pos_top="58%",pos_right="65%"))
.add(bar1,grid_opts=opts.GridOpts(pos_top="58%",pos_bottom="5%",pos_right="35%",pos_left="40%"),is_control_axis_index=True)
)
grid.render_notebook()