最近在開發股票可視化案例,使用pyecharts可視化工具比較多,主要有下面幾個感受和大家分享下:
1.對於剛學習可視化或者轉行數據分析工作的同學可以花幾天時間研究下,上手比較快,顏色搭配也比較好看。2.公司裏面能夠願意花錢,商業版可視化Powerbi、Tablueau、FineBI要比這個好用不少。3. pyecharts在做成精緻的看板方面還是不夠靈活的,需要藉助前身echarts來用,這個就要求些前端能力了。
下面主要結合官網來介紹下pyecharts的使用,以及使用過程中的細節部分(代碼中的註釋)
閱讀路線:
- 概況
- 快速開始
- 高階知識
- 保存爲圖片
一:概況
Echarts 是一個由百度開源的數據可視化,憑藉着良好的交互性,精巧的圖表設計,得到了衆多開發者的認可。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析遇上數據可視化時,pyecharts 誕生了。
目前使用的都是新版本系列是從v1.0.0 開始,僅支持python3.6+。且老版本0.5.x系列已經不再維護了。
二:快速開始
2.1 安裝
$ pip install pyecharts
2.2 五分鐘上手
首先開始來繪製你的第一個圖表
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 會生成本地 HTML 文件,默認會在當前目錄生成 render.html 文件
# 也可以傳入路徑參數,如 bar.render("mycharts.html")
bar.render()
但是我們更常用的還是鏈式方法,如下:
from pyecharts.charts import Bar
bar = (
Bar()
.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
)
bar.render()
但是我們上面顯示的圖片光禿禿的,標題配色都沒有,想想看底層是js的pyecharts怎麼會沒有呢?其實它是通過配置項來完成的,下面一起來看看把
2.3 配置項
配置項主要分爲全局配置項和系列配置項,我們先通過demon來看下如何使用的。
from pyecharts.charts import Bar
from pyecharts import options as opts
# 內置主題類型可查看 pyecharts.globals.ThemeType
from pyecharts.globals import ThemeType
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) #初始化配置項
.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
.set_global_opts(title_opts=opts.TitleOpts(title="主標題", subtitle="副標題")) #主題配置項
)
bar.render()
展示如下圖:
具體的配置需要大家結合配置文檔和官網展示demon來學習,這樣學習的會更快更有趣。
三:高階知識
3.1 組合圖表
剛剛我們看到的都是一個個的圖表展示出來的,那我們如何使圖表進行組合展示呢,方法有如下的三種:Grid並行多圖、Page順序多圖、Timeline時間線輪播多圖
3.1.1 Grid-上下佈局
from example.commons import Faker #導入案例數據集
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line,Scatter
def grid_vertical() -> Grid:
bar = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Grid-Bar")) #全局配置--標題配置
)
line = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Grid-Line", pos_top="48%"), #pos_top ='48%' 距離上側且爲容器高度的48%,
legend_opts=opts.LegendOpts(pos_top="48%"),#圖例配置項
)
)
grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(line, grid_opts=opts.GridOpts(pos_top="60%"))
)
return grid
grid_vertical().render()
展示如下圖所示:
3.1.2 Grid-左右佈局
from example.commons import Faker #導入案例數據集
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line,Scatter
def grid_horizontal() -> Grid:
scatter = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Grid-Scatter"),
legend_opts=opts.LegendOpts(pos_left="20%"),
)
)
line = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Grid-Line", pos_right="5%"),
legend_opts=opts.LegendOpts(pos_right="20%"),
)
)
grid = (
Grid()
.add(scatter, grid_opts=opts.GridOpts(pos_left="55%"))
.add(line, grid_opts=opts.GridOpts(pos_right="55%"))
)
return grid
3.1.3 page順序多圖
def grid_mutil_yaxis() -> Grid:
x_data = ["{}月".format(i) for i in range(1, 13)]
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis(
"蒸發量",
[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
yaxis_index=0,
color="#d14a61",
)
.add_yaxis(
"降水量",
[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
yaxis_index=1,
color="#5793f3",
)
.extend_axis(
yaxis=opts.AxisOpts(
name="蒸發量",
type_="value",
min_=0,
max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
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="#675bba")
),
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(
name="降水量",
min_=0,
max_=250,
position="right",
offset=80,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#5793f3")
),
axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
),
title_opts=opts.TitleOpts(title="Grid-多 Y 軸示例"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"平均溫度",
[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
yaxis_index=2,
color="#675bba",
label_opts=opts.LabelOpts(is_show=False),
)
)
bar.overlap(line)
return Grid().add(
bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True
)
# 需要自行調整每個 chart 的 height/width,顯示效果在不同的顯示器上可能不同
page = Page(layout=Page.SimplePageLayout)
page.add(bar_datazoom_slider(), line_markpoint(), pie_rosetype(), grid_mutil_yaxis())
page.render()
3.2 保存爲圖片
- 安裝phantomjs
Windows下載地址
下載好之後運行exe文件即可
- 配置phantomjs環境變量
- 保存爲圖片
經過好幾次嘗試後,發現儘管配置了phantomjs還是不起作用的,這裏採用的方法是把exe文件和下面的腳本放到一起便可保存成功了。
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot
def bar_chart() -> Bar:
c = (
Bar()
.add_xaxis(["襯衫", "毛衣", "領帶", "褲子", "風衣", "高跟鞋", "襪子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-測試渲染圖片"))
)
return c
make_snapshot(snapshot, bar_chart().render(), "bar0.png")
注意:如果掌握上面的內容,對於開發一個不錯的可視化看板是遠遠不夠的,之後隨着股票可視化的案例的完善,會一直不斷的進行補充的。