Python
pyecharts 是 Python 和 Echarts 的结合,绘制出的图表十分精美且种类丰富
pyecharts目前更新到 1.7.0,1.x版本与0.5.x版本在语法上有很大区别
安装
这里我们直接安装最新版本:
pip(3) install pyecharts
如果安装后导入有问题,可以尝试源码安装:
$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install
# 或者执行 python install.py
柱形图
from pyecharts.charts import Bar
from pyecharts import options as opts
x = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
y1 = [5, 20, 36, 10, 75, 90]
y2 = [15, 6, 45, 20, 35, 66]
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("商家A", y1)
.add_yaxis("商家B", y2)
.set_global_opts(title_opts=opts.TitleOpts(title="主标题",
subtitle="副标题"))
)
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()
在notebook中显示图表
pyecharts也支持Jupyter Notebook 和 JupyterLab,但是在notebook中渲染图表时要求不同:
Jupyter Notebook 用 bar.render_notebook()直接渲染
JupyterLab 则稍微复杂一些:
必须在引入 pyecharts.charts 等模块前声明Notebook 类型
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
第一次渲染时要先用 bar.load_javascript() 预先加载基本 JavaScript 文件到 Notebook 中
然后在不同的cell中运行bar.render_notebook()
这样就可以一边运行代码,一边查看图片结果啦。
Bar-DataZoom(slider+inside)
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.charts import Bar
bar = (
Bar()
.add_xaxis(Faker.days_attrs)
.add_yaxis("", Faker.days_values, color=Faker.rand_color())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom"),
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
)
)
bar.render_notebook()
效果比较炫酷
堆叠柱形图
from pyecharts.charts import Bar
from pyecharts import options as opts
x = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
y1 = [5, 20, 36, 10, 75, 90]
y2 = [15, 6, 45, 20, 35, 66]
#通过stack="stack1"设置堆叠
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("商家A", y1, stack="stack1")
.add_yaxis("商家B", y2, stack="stack1")
.set_global_opts(title_opts=opts.TitleOpts(title="主标题",
subtitle="副标题"))
)
bar.render_notebook()
更换图表风格
以上图表都是pyecharts的默认主题,其实pyecharts内置10+种不同主题,可以自行选用。
from pyecharts.charts import Bar
from pyecharts import options as opts
#引入主题模块
from pyecharts.globals import ThemeType
x = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
y1 = [5, 20, 36, 10, 75, 90]
y2 = [15, 6, 45, 20, 35, 66]
# init_opts=opts.InitOpts(theme=ThemeType.LIGHT) 选用LIGHT主题
# .reversal_axis()交换 XY 轴
# .set_series_opts(label_opts=opts.LabelOpts(position="right")) 指定数据显示位置为右侧
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(x)
.add_yaxis("商家A", y1)
.add_yaxis("商家B", y2)
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="主题为LIGHT",
subtitle="副标题"))
)
bar.render_notebook()
添加标记点
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
x = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
y1 = [5, 20, 36, 10, 75, 90]
y2 = [15, 6, 45, 20, 35, 66]
# 通过markpoint_opts添加标记点
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_xaxis(x)
.add_yaxis("商家A", y1)
.add_yaxis("商家B", y2)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
)
.set_global_opts(title_opts=opts.TitleOpts(title="主题为DARK",
subtitle="最大值、最小值标记点"))
)
bar.render_notebook()
饼图
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import ThemeType
list = [['可乐', 76], ['雪碧', 49], ['橙汁', 115]]
bar = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("", list)
.set_global_opts(title_opts=opts.TitleOpts(title="饼图"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b} : {c} {d}%"))
)
bar.render_notebook()
多饼图
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.commons.utils import JsCode
fn = """
function(params) {
if(params.name == '其他')
return '\\n\\n\\n' + params.name + ' : ' + params.value + '%';
return params.name + ' : ' + params.value + '%';
}
"""
def new_label_opts():
return opts.LabelOpts(formatter=JsCode(fn), position="center")
c = (
Pie()
.add(
"",
[list(z) for z in zip(["剧情", "其他"], [25, 75])],
center=["20%", "30%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["奇幻", "其他"], [24, 76])],
center=["55%", "30%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["爱情", "其他"], [14, 86])],
center=["20%", "70%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["惊悚", "其他"], [11, 89])],
center=["55%", "70%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Pie-多饼图示例"),
legend_opts=opts.LegendOpts(
type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
),
)
)
c.render_notebook()
多维散点图
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
Scatter = (
Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(Faker.choose())
.add_yaxis(
"商家A",
[list(z) for z in zip(Faker.values(), Faker.choose())],
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(params){return params.value[1] +' : '+ params.value[2];}"
),
#position="inside"
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-多维度数据"),
tooltip_opts=opts.TooltipOpts(
formatter=JsCode(
"function (params) {return params.name + ' : ' + params.value[2];}"
)
),
visualmap_opts=opts.VisualMapOpts(
type_="size", max_=150, min_=20, dimension=1
),
)
)
Scatter.render_notebook()
漏斗图
from pyecharts import options as opts
from pyecharts.charts import Funnel, Page
from pyecharts.globals import ThemeType
labels = ['浏览人数', '加购人数', '购买人数']
data = [100, 50, 30]
funnel = (
Funnel(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("", [list(z) for z in zip(labels, data)],
label_opts=opts.LabelOpts(position="inside"))
.set_global_opts(title_opts=opts.TitleOpts(title="销售转化漏斗"))
)
funnel.render_notebook()
词云
from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType
words = [
("火锅", 1446),
("面包", 928),
("油条", 906),
("牛奶", 825),
("凉皮", 514),
("早餐", 486),
("吐司", 53),
("芝士", 163),
("酸奶", 86),
("奶茶", 17),
("蛋糕", 678),
("烧烤", 567),
("土豆", 437),
("巧克力", 422),
("甜甜圈", 353),
("苹果", 331)]
wordcloud = (
WordCloud()
.add(
"",
words,
word_size_range=[20, 100],
rotate_step = 90,#设置文字角度
textstyle_opts=opts.TextStyleOpts(font_family="cursive"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="WordCloud"))
)
wordcloud.render_notebook()
中国疫情地图
from pyecharts import options as opts
from pyecharts.charts import Map
#数据截至 2020/2/29 22:14 现存确诊
data = [['湖北', 34617], ['广东', 366], ['山东', 332], ['浙江', 188], ['四川', 184],
['湖南', 170], ['黑龙江', 166], ['重庆', 148],['北京', 132], ['江西', 123],
['安徽', 116], ['江苏', 108], ['河南', 81], ['广西', 74], ['香港', 62],
['福建', 53],['上海', 47], ['陕西', 37], ['贵州', 32], ['河北', 31],
['台湾', 29], ['内蒙古', 26], ['辽宁', 25], ['天津', 24],['山西', 20],
['吉林', 17], ['海南', 16], ['云南', 15], ['新疆', 11], ['甘肃', 7],
['宁夏', 4], ['澳门', 2],
['青海', 0], ['西藏', 0]]
map = (
Map()
.add("现存确诊", data, "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="现存确诊疫情地图"),
visualmap_opts=opts.VisualMapOpts(max_=35000, is_piecewise=True,
pieces=[
{"min": 10000, "label": '>10000人', "color": "#6666CC"},
{"min": 1000, "max": 10000, "label": '1001-10000人', "color": "#9999FF"},
{"min": 500, "max": 999, "label": '999-1000人', "color": "#CCCCFF"},
{"min": 100, "max": 499, "label": '100-499人', "color": "#FF9999"},
{"min": 10, "max": 99, "label": '10-99人', "color": "#FFCCCC"},
{"min": 1, "max": 9, "label": '0-9人', "color": "#CCCCCC"},
{"min": 0, "max": 0, "label": '0人', "color": "#ffffff"},
],),
)
)
map.render_notebook()
以上只是pyecharts的一些基本示例,然而它的强大之处远不止于此。
具体可参考官方文档:https://pyecharts.org/#/zh-cn/intro
文章转载自DataGirl,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。