# Python pyecharts怎么绘制柱状图呢？下面给大家解答

> 作者/来源: UCloud 运营管理员
> 发布时间: 2022-11-11T02:48:00.000Z
> 分类: 其他
> 标签: AI, Python
> 原文链接: http://117.50.162.249:3000/yun/articles/2166

---

# Python pyecharts怎么绘制柱状图呢？下面给大家解答

> 来源: https://www.ucloud.cn/yun/128310.html
> 作者: 89542767
> 发布日期: 发布于2022-11-11 10:48

这篇文章介绍的主要内容是，利用Python pyecharts去绘制柱状图，涉及到内容知识点还是比较的多的，那么，具体需要怎么操作呢？下面就给大家以案例的形式，去做一个介绍，大家仔细的阅读下。

**主题介绍**

　　pyecharts里面有很多的主题可以供我们选择，我们可以根据自己的需要完成主题的配置，这样就告别了软件的限制，可以随意的发挥自己的艺术细胞了。

**图表参数**

```
　　'''
　　def add_yaxis(
　　#系列名称，用于tooltip的显示，legend的图例筛选。
　　series_name:str,
　　#系列数据
　　y_axis:Sequence[Numeric,opts.BarItem,dict],
　　#是否选中图例
　　is_selected:bool=True,
　　#使用的x轴的index，在单个图表实例中存在多个x轴的时候有用。
　　xaxis_index:Optional[Numeric]=None,
　　#使用的y轴的index，在单个图表实例中存在多个y轴的时候有用。
　　yaxis_index:Optional[Numeric]=None,
　　#是否启用图例hover时的联动高亮
　　is_legend_hover_link:bool=True,
　　#系列label颜色
　　color:Optional[str]=None,
　　#是否显示柱条的背景色。通过backgroundStyle配置背景样式。
　　is_show_background:bool=False,
　　#每一个柱条的背景样式。需要将showBackground设置为true时才有效。
　　background_style:types.Union[types.BarBackground,dict,None]=None,
　　#数据堆叠，同个类目轴上系列配置相同的stack值可以堆叠放置。
　　stack:Optional[str]=None,
　　#柱条的宽度，不设时自适应。
　　#可以是绝对值例如40或者百分数例如'60%'。百分数基于自动计算出的每一类目的宽度。
　　#在同一坐标系上，此属性会被多个'bar'系列共享。此属性应设置于此坐标系中最后一个'bar'系列上才会生效，并且是对此坐标系中所有'bar'系列生效。
　　bar_width:types.Union[types.Numeric,str]=None,
　　#柱条的最大宽度。比barWidth优先级高。
　　bar_max_width:types.Union[types.Numeric,str]=None,
　　#柱条的最小宽度。在直角坐标系中，默认值是1。否则默认值是null。比barWidth优先级高。
　　bar_min_width:types.Union[types.Numeric,str]=None,
　　#柱条最小高度，可用于防止某数据项的值过小而影响交互。
　　bar_min_height:types.Numeric=0,
　　#同一系列的柱间距离，默认为类目间距的20%，可设固定值
　　category_gap:Union[Numeric,str]="20%",
　　#不同系列的柱间距离，为百分比（如'30%'，表示柱子宽度的30%）。
　　#如果想要两个系列的柱子重叠，可以设置gap为'-100%'。这在用柱子做背景的时候有用。
　　gap:Optional[str]="30%",
　　#是否开启大数据量优化，在数据图形特别多而出现卡顿时候可以开启。
　　#开启后配合largeThreshold在数据量大于指定阈值的时候对绘制进行优化。
　　#缺点：优化后不能自定义设置单个数据项的样式。
　　is_large:bool=False,
　　#开启绘制优化的阈值。
　　large_threshold:types.Numeric=400,
　　#使用dimensions定义series.data或者dataset.source的每个维度的信息。
　　#注意：如果使用了dataset，那么可以在dataset.source的第一行/列中给出dimension名称。
　　#于是就不用在这里指定dimension。
　　#但是，如果在这里指定了dimensions，那么ECharts不再会自动从dataset.source的第一行/列中获取维度信息。
　　dimensions:types.Union[types.Sequence,None]=None,
　　#当使用dataset时，seriesLayoutBy指定了dataset中用行还是列对应到系列上，也就是说，系列“排布”到dataset的行还是列上。可取值：
　　#'column'：默认，dataset的列对应于系列，从而dataset中每一列是一个维度（dimension）。
　　#'row'：dataset的行对应于系列，从而dataset中每一行是一个维度（dimension）。
　　series_layout_by:str="column",
　　#如果series.data没有指定，并且dataset存在，那么就会使用dataset。
　　#datasetIndex指定本系列使用那个dataset。
　　dataset_index:types.Numeric=0,
　　#是否裁剪超出坐标系部分的图形。柱状图：裁掉所有超出坐标系的部分，但是依然保留柱子的宽度
　　is_clip:bool=True,
　　#柱状图所有图形的zlevel值。
　　z_level:types.Numeric=0,
　　#柱状图组件的所有图形的z值。控制图形的前后顺序。
　　#z值小的图形会被z值大的图形覆盖。
　　#z相比zlevel优先级更低，而且不会创建新的Canvas。
　　z:types.Numeric=2,
　　#标签配置项，参考`series_options.LabelOpts`
　　label_opts:Union[opts.LabelOpts,dict]=opts.LabelOpts(),
　　#标记点配置项，参考`series_options.MarkPointOpts`
　　markpoint_opts:Union[opts.MarkPointOpts,dict,None]=None,
　　#标记线配置项，参考`series_options.MarkLineOpts`
　　markline_opts:Union[opts.MarkLineOpts,dict,None]=None,
　　#提示框组件配置项，参考`series_options.TooltipOpts`
　　tooltip_opts:Union[opts.TooltipOpts,dict,None]=None,
　　#图元样式配置项，参考`series_options.ItemStyleOpts`
　　itemstyle_opts:Union[opts.ItemStyleOpts,dict,None]=None,
　　#可以定义data的哪个维度被编码成什么。
　　encode:types.Union[types.JSFunc,dict,None]=None,
　　)
　　'''
```

　　我们可以进行图表参数的配置，完成我们需要的结果展示。

**主题详解**

　　下面列举了比较详细的主题风格，随意搭配，碰撞出不一样的火花！

```
　　from pyecharts.globals import ThemeType
　　help(ThemeType)
　　"""
　　{"theme":ThemeType.MACARONS}
　　BUILTIN_THEMES=['light','dark','white']
　　|
　　|CHALK='chalk'#粉笔风
　　|
　　|DARK='dark'#暗黑风
　　|
　　|ESSOS='essos'#厄索斯大陆
　　|
　　|INFOGRAPHIC='infographic'#信息图
　　|
　　|LIGHT='light'#明亮风格
　　|
　　|MACARONS='macarons'#马卡龙
　　|
　　|PURPLE_PASSION='purple-passion'#紫色激情
　　|
　　|ROMA='roma'#石榴
　　|
　　|ROMANTIC='romantic'#浪漫风
　　|
　　|SHINE='shine'#闪耀风
　　|
　　|VINTAGE='vintage'#复古风
　　|
　　|WALDEN='walden'#瓦尔登湖
　　|
　　|WESTEROS='westeros'#维斯特洛大陆
　　|
　　|WHITE='white'#洁白风
　　|
　　|WONDERLAND='wonderland'#仙境
　　"""
```

**柱状图模板系列**

　　海量数据柱状图动画展示

　　非常多的数据集，我们需要展示的话，我们可以利用这个模板进行展示，下面由于数据量过多我就不展示全部的数据了。

```
　　import pyecharts.options as opts
　　from pyecharts.charts import Bar
　　category=["类目{}".format(i)for i in range(0,100)]
　　red_bar=['数据集非常多！！！！']
　　(
　　Bar(init_opts=opts.InitOpts(width="1500px",height="700px"))
　　.add_xaxis(xaxis_data=category)
　　.add_yaxis(
　　series_name="系列1",y_axis=red_bar,label_opts=opts.LabelOpts(is_show=False)
　　)
　　.add_yaxis(
　　series_name="系列2",
　　y_axis=blue_bar,
　　label_opts=opts.LabelOpts(is_show=False),
　　)
　　.set_global_opts(
　　title_opts=opts.TitleOpts(title="柱状图动画延迟"),
　　xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=False)),
　　yaxis_opts=opts.AxisOpts(
　　axistick_opts=opts.AxisTickOpts(is_show=True),
　　splitline_opts=opts.SplitLineOpts(is_show=True),
　　),
　　)
　　.render("柱状图动画延迟.html")
　　)
　　print("图表已生成！请查收！")
```

![01.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_000.png)

**收入支出柱状图（适用于记账）**

　　我们在日常的生活中，有收入也有支出，这个模板就是把收入和支出直观的展示在读者面前。

```
　　from pyecharts.charts import Bar
　　from pyecharts import options as opts
　　#一般不适用
　　x_data=[f"11月{str(i)}日"for i in range(1,12)]
　　y_total=[0,900,1245,1530,1376,1376,1511,1689,1856,1495,1292]
　　y_in=[900,345,393,"-","-",135,178,286,"-","-","-"]
　　y_out=["-","-","-",108,154,"-","-","-",119,361,203]
　　bar=(
　　Bar()
　　.add_xaxis(xaxis_data=x_data)
　　.add_yaxis(
　　series_name="",
　　y_axis=y_total,
　　stack="总量",
　　itemstyle_opts=opts.ItemStyleOpts(color="rgba(0,0,0,0)"),
　　)
　　.add_yaxis(series_name="收入",y_axis=y_in,stack="总量")
　　.add_yaxis(series_name="支出",y_axis=y_out,stack="总量")
　　.set_global_opts(yaxis_opts=opts.AxisOpts(type_="value"))
　　.render("收入支出柱状图.html")
　　)
　　print("图表已生成！请查收！")
　　三维数据叠加
　　from pyecharts import options as opts
　　from pyecharts.charts import Bar
　　from pyecharts.faker import Faker
　　c=(
　　Bar()
　　.add_xaxis(Faker.choose())
　　.add_yaxis("商家A",Faker.values(),stack="stack1")
　　.add_yaxis("商家B",Faker.values(),stack="stack1")
　　.add_yaxis("商家C",Faker.values(),stack="stack1")
　　.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
　　.set_global_opts(title_opts=opts.TitleOpts(title="标题"))
　　.render("三维数据折叠.html")
　　)
　　print("图表已生成！查收！")
```

![02.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_001.png)

**柱状图与折线图多维展示（同屏展示）**

　　柱状图里面也有折线图，适合我们在特定情况下进行数据展示，效果还是比较的直观，方便我们可以直接get到数据的价值。

```
　　import pyecharts.options as opts
　　from pyecharts.charts import Bar,Line
　　x_data=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]
　　bar=(
　　Bar(init_opts=opts.InitOpts(width="1100px",height="600px"))
　　.add_xaxis(xaxis_data=x_data)
　　.add_yaxis(
　　series_name="蒸发量",
　　y_axis=[
　　2.0,
　　4.9,
　　7.0,
　　23.2,
　　25.6,
　　76.7,
　　135.6,
　　162.2,
　　32.6,
　　20.0,
　　6.4,
　　3.3,
　　],
　　label_opts=opts.LabelOpts(is_show=False),
　　)
　　.add_yaxis(
　　series_name="降水量",
　　y_axis=[
　　2.6,
　　5.9,
　　9.0,
　　26.4,
　　28.7,
　　70.7,
　　175.6,
　　182.2,
　　48.7,
　　18.8,
　　6.0,
　　2.3,
　　],
　　label_opts=opts.LabelOpts(is_show=False),
　　)
　　.extend_axis(
　　yaxis=opts.AxisOpts(
　　name="温度",
　　type_="value",
　　min_=0,
　　max_=25,
　　interval=5,
　　axislabel_opts=opts.LabelOpts(formatter="{value}°C"),
　　)
　　)
　　.set_global_opts(
　　tooltip_opts=opts.TooltipOpts(
　　is_show=True,trigger="axis",axis_pointer_type="cross"
　　),
　　xaxis_opts=opts.AxisOpts(
　　name='月份',
　　name_location='middle',
　　name_gap=30,#标签与轴线之间的距离，默认为20，最好不要设置20
　　name_textstyle_opts=opts.TextStyleOpts(
　　font_family='Times New Roman',
　　font_size=16,#标签字体大小
　　#type_="category",
　　#axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
　　)),
　　yaxis_opts=opts.AxisOpts(
　　name="水量",
　　type_="value",
　　min_=0,
　　max_=250,
　　interval=50,
　　axislabel_opts=opts.LabelOpts(formatter="{value}ml"),
　　axistick_opts=opts.AxisTickOpts(is_show=True),
　　splitline_opts=opts.SplitLineOpts(is_show=True),
　　),
　　)
　　)
　　line=(
　　Line()
　　.add_xaxis(xaxis_data=x_data)
　　.add_yaxis(
　　series_name="平均温度",
　　yaxis_index=1,
　　y_axis=[2.0,2.2,3.3,4.5,6.3,10.2,20.3,23.4,23.0,16.5,12.0,6.2],
　　label_opts=opts.LabelOpts(is_show=False),
　　)
　　)
　　bar.overlap(line).render("折线图-柱状图多维展示.html")
　　print("图表已生成！请查收！")
```

![04.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_002.png)

```
　　import pyecharts.options as opts
　　from pyecharts.charts import Bar,Line
　　colors=["#5793f3","#d14a61","#675bba"]
　　x_data=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]
　　legend_list=["蒸发量","降水量","平均温度"]
　　evaporation_capacity=[
　　2.0,
　　4.9,
　　7.0,
　　23.2,
　　25.6,
　　76.7,
　　135.6,
　　162.2,
　　32.6,
　　20.0,
　　6.4,
　　3.3,
　　]
　　rainfall_capacity=[
　　2.6,
　　5.9,
　　9.0,
　　26.4,
　　28.7,
　　70.7,
　　175.6,
　　182.2,
　　48.7,
　　18.8,
　　6.0,
　　2.3,
　　]
　　average_temperature=[2.0,2.2,3.3,4.5,6.3,10.2,20.3,23.4,23.0,16.5,12.0,6.2]
　　bar=(
　　Bar(init_opts=opts.InitOpts(width="1100px",height="600px"))
　　.add_xaxis(xaxis_data=x_data)
　　.add_yaxis(
　　series_name="蒸发量",
　　y_axis=evaporation_capacity,
　　yaxis_index=0,
　　color=colors[1],
　　)
　　.add_yaxis(
　　series_name="降水量",y_axis=rainfall_capacity,yaxis_index=1,color=colors[0]
　　)
　　.extend_axis(
　　yaxis=opts.AxisOpts(
　　name="蒸发量",
　　type_="value",
　　min_=0,
　　max_=250,
　　position="right",
　　axisline_opts=opts.AxisLineOpts(
　　linestyle_opts=opts.LineStyleOpts(color=colors[1])
　　),
　　axislabel_opts=opts.LabelOpts(formatter="{value}ml"),
　　)
　　)
　　.extend_axis(
　　yaxis=opts.AxisOpts(
　　type_="value",
　　name="温度",
　　min_=0,
　　max_=25,
　　position="left",
　　axisline_opts=opts.AxisLineOpts(
　　linestyle_opts=opts.LineStyleOpts(color=colors[2])
　　),
　　axislabel_opts=opts.LabelOpts(formatter="{value}°C"),
　　splitline_opts=opts.SplitLineOpts(
　　is_show=True,linestyle_opts=opts.LineStyleOpts(opacity=1)
　　),
　　)
　　)
　　.set_global_opts(
　　yaxis_opts=opts.AxisOpts(
　　type_="value",
　　name="降水量",
　　min_=0,
　　max_=250,
　　position="right",
　　offset=80,
　　axisline_opts=opts.AxisLineOpts(
　　linestyle_opts=opts.LineStyleOpts(color=colors[0])
　　),
　　axislabel_opts=opts.LabelOpts(formatter="{value}ml"),
　　),
　　tooltip_opts=opts.TooltipOpts(trigger="axis",axis_pointer_type="cross"),
　　)
　　)
　　line=(
　　Line()
　　.add_xaxis(xaxis_data=x_data)
　　.add_yaxis(
　　series_name="平均温度",y_axis=average_temperature,yaxis_index=2,color=colors[2]
　　)
　　)
　　bar.overlap(line).render("多维展示显示数据.html")
```

![05.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_003.png)

　　单列多维数据展示

```
　　from pyecharts import options as opts
　　from pyecharts.charts import Bar
　　from pyecharts.commons.utils import JsCode
　　from pyecharts.globals import ThemeType
　　'''
　　功能：定义多个列表，一个单列柱状图里面可以显示多个产品的数量（显示各自所占比例）达到一图多效果展示
　　应用场景：比如有3个产品，分别在星期一到星期天有不同的销售额，每一天三个不同的产品也都有各自的销售额
　　需要同时展示出这些信息，并分析出每一个产品在一天中所占比例是多少
　　涉及知识：列表里面嵌套多个字典
　　'''
　　list2=[
　　{"value":12,"percent":12/(12+3)},#对于各自的值，同时对于各自的百分比
　　{"value":23,"percent":23/(23+21)},
　　{"value":33,"percent":33/(33+5)},
　　{"value":3,"percent":3/(3+52)},
　　{"value":33,"percent":33/(33+43)},
　　{"value":45,"percent":45/(45+3)},
　　{"value":23,"percent":23/(23+13)},
　　]
　　list3=[
　　{"value":3,"percent":3/(12+3)},
　　{"value":21,"percent":21/(23+21)},
　　{"value":5,"percent":5/(33+5)},
　　{"value":52,"percent":52/(3+52)},
　　{"value":43,"percent":43/(33+43)},
　　{"value":3,"percent":45/(45+3)},
　　{"value":13,"percent":13/(23+13)},
　　]
　　#可以添加多个列表
　　#list4=[]
　　c=(
　　Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
　　.add_xaxis([1,2,3,4,5,6,7])#横坐标变量参数
　　#数据堆叠，同个类目轴上系列配置相同的stack值可以堆叠放置
　　#同一系列的柱间距离，默认为类目间距的20%，可设固定值
　　.add_yaxis("产品1",list2,stack="stack1",category_gap="50%")
　　.add_yaxis("产品2",list3,stack="stack1",category_gap="50%")
　　.set_series_opts(
　　label_opts=opts.LabelOpts(
　　position="right",
　　formatter=JsCode(
　　"function(x){return Number(x.data.percent*100).toFixed()+'%';}"
　　),
　　)
　　)
　　#X Y轴的系列配置
　　.set_global_opts(title_opts=opts.TitleOpts(title="标题"),
　　xaxis_opts=opts.AxisOpts(
　　name='星期',
　　name_location='middle',
　　name_gap=30,#标签与轴线之间的距离，默认为20，最好不要设置20
　　name_textstyle_opts=opts.TextStyleOpts(
　　font_family='Times New Roman',
　　font_size=16#标签字体大小
　　)),
　　yaxis_opts=opts.AxisOpts(
　　name='数量',
　　name_location='middle',
　　name_gap=30,
　　name_textstyle_opts=opts.TextStyleOpts(
　　font_family='Times New Roman',
　　font_size=16
　　#font_weight='bolder',
　　)),
　　#toolbox_opts=opts.ToolboxOpts()#工具选项
　　)
　　.render("单列多维占比层次柱状图.html")
　　)
　　print("图表已生成！请查收！")
```

![06.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_004.png)

**3D柱状图**

　　这类图表一般不会用到，但是pyecharts也可以生成这种炫酷的3D模板，来看看吧！

![07.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_005.png)

![08.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_006.png)

![09.png](https://ucloud-blog.cn-bj.ufileos.com/articles/128310/images/128310_007.png)

　　上述3D图形都可以通过鼠标进行控制，翻转

```
　　import random
　　from pyecharts import options as opts
　　from pyecharts.charts import Bar3D
　　x_data=y_data=list(range(10))
　　def generate_data():
　　data=[]
　　for j in range(10):
　　for k in range(10):
　　value=random.randint(0,9)
　　data.append([j,k,value*2+4])
　　return data
　　bar3d=Bar3D(init_opts=opts.InitOpts(width="1500px",height="700px"))
　　for _ in range(10):
　　bar3d.add(
　　"",
　　generate_data(),
　　shading="lambert",
　　xaxis3d_opts=opts.Axis3DOpts(data=x_data,type_="value"),
　　yaxis3d_opts=opts.Axis3DOpts(data=y_data,type_="value"),
　　zaxis3d_opts=opts.Axis3DOpts(type_="value"),
　　)
　　bar3d.set_global_opts(title_opts=opts.TitleOpts("Bar3D-堆叠柱状图示例"))
　　bar3d.set_series_opts(**{"stack":"stack"})
　　bar3d.render("3D堆叠柱状图.html")
```

　　柱状图的模板大全差不多都是这些了，下期文章我们一起领略折线图的魅力吧！

　　到此为止，这篇文章就给大家介绍到这里了，希望可以给大家带来帮助。