這幾個(gè)用 Pyecharts 做出來(lái)的交互圖表,領(lǐng)導(dǎo)說(shuō)叼爆了!

作者 |?舊時(shí)晚風(fēng)拂曉城? ? ? ?編輯?| JackTian
來(lái)源 | 杰哥的IT之旅(ID:Jake_Internet)
一、Pyecharts簡(jiǎn)介和安裝
1、簡(jiǎn)介
Echarts 是一個(gè)由百度開(kāi)源的數(shù)據(jù)可視化,憑借著良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開(kāi)發(fā)者的認(rèn)可。而 Python 是一門(mén)富有表達(dá)力的語(yǔ)言,很適合用于數(shù)據(jù)處理。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時(shí),pyecharts 誕生了。
簡(jiǎn)潔的 API 設(shè)計(jì),使用如絲滑般流暢,支持鏈?zhǔn)秸{(diào)用
囊括了 30+ 種常見(jiàn)圖表,應(yīng)有盡有
支持主流 Notebook 環(huán)境,Jupyter Notebook 和 JupyterLab
可輕松集成至 Flask,Sanic,Django 等主流 Web 框架
高度靈活的配置項(xiàng),可輕松搭配出精美的圖表
詳細(xì)的文檔和示例,幫助開(kāi)發(fā)者更快的上手項(xiàng)目
多達(dá) 400+ 地圖文件,并且支持原生百度地圖,為地理數(shù)據(jù)可視化提供強(qiáng)有力的支持
pyecharts版本v0.5.x 和 v1 間不兼容,v1 是一個(gè)全新的版本,語(yǔ)法也有很大不同。
2、安裝
安裝 pyecharts
pip?install?pyecharts?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com
import?pyecharts
print(pyecharts.__version__)?????????#?查看pyecharts版本
安裝相關(guān)的地圖擴(kuò)展包
pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple?echarts-countries-pypkg???????????#?全球國(guó)家地圖
pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple?echarts-china-provinces-pypkg???#?中國(guó)省級(jí)地圖
pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple?echarts-china-cities-pypkg??????#?中國(guó)市級(jí)地圖
pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple?echarts-china-counties-pypkg????#?中國(guó)縣區(qū)級(jí)地圖
二、繪制地理圖表
1、世界地圖—數(shù)據(jù)可視化
利用 Starbucks.csv 中的數(shù)據(jù),首先計(jì)算每個(gè)國(guó)家(Country)對(duì)應(yīng)的門(mén)店數(shù)量,然后使用世界地圖表示星巴克門(mén)面店在全球的分布。
import?pandas?as?pd
from?pyecharts.charts?import?Map
from?pyecharts?import?options?as?opts
from?pyecharts.globals?import?ThemeType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
#?用pandas讀取csv文件里的數(shù)據(jù)
df?=?pd.read_csv("Starbucks.csv")['Country']
data?=?df.value_counts()
datas?=?[(i,?int(j))?for?i,?j?in?zip(data.index,?data.values)]
#?實(shí)例化一個(gè)Map對(duì)象
map_?=?Map(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
#?世界地圖
map_.add("門(mén)店數(shù)量",?data_pair=datas,?maptype="world")
map_.set_series_opts(label_opts=opts.LabelOpts(is_show=False))???#?不顯示label
map_.set_global_opts(
?????title_opts=opts.TitleOpts(title="星巴克門(mén)店數(shù)量在全球分布",?pos_left='40%',?pos_top='10'),???#?調(diào)整title位置
?????legend_opts=opts.LegendOpts(is_show=False),
?????visualmap_opts=opts.VisualMapOpts(max_=13608,?min_=1,?is_piecewise=True,
?????pieces=[{"max":?9,?"min":?1,?"label":?"1-9",?"color":?"#00FFFF"},????????#?分段??添加圖例注釋和顏色
??????????{"max":?99,?"min":?10,?"label":?"10-99",?"color":?"#A52A2A"},
??????????{"max":?499,?"min":?100,?"label":?"100-499",?"color":?"#0000FF????"},
??????????{"max":?999,?"min":?500,?"label":?"500-999",?"color":?"#FF00FF"},
??????????{"max":?2000,?"min":?1000,?"label":?"1000-2000",?"color":?"#228B22"},
??????????{"max":?3000,?"min":?2000,?"label":?"2000-3000",?"color":?"#FF0000"},
??????????{"max":?20000,?"min":?10000,?"label":?">=10000",?"color":?"#FFD700"}
?????????????])
?????)
#?渲染在網(wǎng)頁(yè)上???有交互性
map_.render('星巴克門(mén)店在全球的分布.html')
運(yùn)行效果如下:

2、國(guó)家地圖—數(shù)據(jù)可視化
漣漪散點(diǎn)圖
利用china.csv 中的數(shù)據(jù),首先計(jì)算每個(gè)城市(City)對(duì)應(yīng)的門(mén)店數(shù)量,然后使用 pyecharts包內(nèi) Geo 模塊繪制星巴克門(mén)面店在中國(guó)分布的漣漪散點(diǎn)地圖。
import?pandas?as?pd
from?pyecharts.globals?import?ThemeType,?CurrentConfig,?GeoType
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Geo
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
#?pandas讀取csv文件數(shù)據(jù)
df?=?pd.read_csv("china.csv")['City']
data?=?df.value_counts()
datas?=?[(i,?int(j))?for?i,?j?in?zip(data.index,?data.values)]
print(datas)
geo?=?Geo(init_opts=opts.InitOpts(width='1000px',?height='600px',?theme=ThemeType.DARK))
geo.add_schema(maptype='china',?label_opts=opts.LabelOpts(is_show=True))???#?顯示label??省名
geo.add('門(mén)店數(shù)量',?data_pair=datas,?type_=GeoType.EFFECT_SCATTER,?symbol_size=8)
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.set_global_opts(title_opts=opts.TitleOpts(title='星巴克門(mén)店在中國(guó)的分布'),
????????????????????visualmap_opts=opts.VisualMapOpts(max_=550,?is_piecewise=True,
????????????????????pieces=[{"max":?50,?"min":?0,?"label":?"0-50",?"color":?"#708090"},????????#?分段??添加圖例注釋??和顏色
??????????????????????????????{"max":?100,?"min":?51,?"label":?"51-100",?"color":?"#00FFFF"},
??????????????????????????????{"max":?200,?"min":?101,?"label":?"101-200",?"color":?"#00008B"},
??????????????????????????????{"max":?300,?"min":?201,?"label":?"201-300",?"color":?"#8B008B"},
??????????????????????????????{"max":?600,?"min":?500,?"label":?"500-600",?"color":?"#FF0000"},
?????????????????????????????????])
????????????????????)
geo.render("星巴克門(mén)店在中國(guó)的分布.html")
運(yùn)行效果如下:

動(dòng)態(tài)軌跡圖
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Geo
from?pyecharts.globals?import?ChartType,?SymbolType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
#?鏈?zhǔn)秸{(diào)用
c?=?(
????Geo()
????.add_schema(
????????maptype="china",
????????itemstyle_opts=opts.ItemStyleOpts(color="#323c48",?border_color="#111"),
????????label_opts=opts.LabelOpts(is_show=True)
????)
????.add(
????????"",
????????[("廣州",?55),?("北京",?66),?("杭州",?77),?("重慶",?88),?('成都',?100),?('???,?80)],
????????type_=ChartType.EFFECT_SCATTER,
????????color="white",
????)
????.add(
????????"",
????????[("廣州",?"上海"),?("廣州",?"北京"),?("廣州",?"杭州"),?("廣州",?"重慶"),
?????????('成都',?'???),?('???,?'北京'),?('海口',?'重慶'),?('重慶',?'上海')
?????????],
????????type_=ChartType.LINES,
????????effect_opts=opts.EffectOpts(
????????????symbol=SymbolType.ARROW,?symbol_size=6,?color="blue"
????????),
????????linestyle_opts=opts.LineStyleOpts(curve=0.2),
????)
????.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
????.set_global_opts(title_opts=opts.TitleOpts(title="動(dòng)態(tài)軌跡圖"))
????.render("geo_lines_background.html")
)
運(yùn)行效果如下:

3、省市地圖—數(shù)據(jù)可視化
熱力圖
代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Geo
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?GeoType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Geo()
????.add_schema(maptype="廣東",?label_opts=opts.LabelOpts(is_show=True))
????.add(
????????"熱力圖",
????????[list(z)?for?z?in?zip(Faker.guangdong_city,?Faker.values())],
????????type_=GeoType.HEATMAP,
????)
????.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
????.set_global_opts(
????????visualmap_opts=opts.VisualMapOpts(),?title_opts=opts.TitleOpts(title="Geo-廣東地圖")
????)
????.render("geo_guangdong.html")
)
運(yùn)行效果如下:
在地圖上批量添加地址、經(jīng)緯度數(shù)據(jù),地理數(shù)據(jù)可視化
代碼如下:
import?pandas?as?pd?????#?導(dǎo)入數(shù)據(jù)分析模塊
from?pyecharts.charts?import?Geo????#?導(dǎo)入地理信息處理模塊
from?pyecharts?import?options?as?opts???#?配置
from?pyecharts.globals?import?GeoType,?CurrentConfig,?ThemeType
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
df?=?pd.read_excel("hotel.xlsx")
#?獲取?地點(diǎn)??經(jīng)緯度信息
geo_sight_coord?=?{df.iloc[i]['酒店地址']:?[df.iloc[i]['經(jīng)度'],?df.iloc[i]['緯度']]?for?i?in?range(len(df))}
data?=?[(df['酒店地址'][j],?f"{int(df['最低價(jià)'][j])}元(最低價(jià))")?for?j?in?range(len(df))]
#?print(data)
#?print(geo_sight_coord)
g?=?Geo(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION,?width="1000px",?height="600px"))
g.add_schema(maptype="北京")
for?k,?v?in?list(geo_sight_coord.items()):
????#?添加地址、經(jīng)緯度數(shù)據(jù)
????g.add_coordinate(k,?v[0],?v[1])
#?漣漪散點(diǎn)圖
g.add("",?data_pair=data,?type_=GeoType.EFFECT_SCATTER,?symbol_size=6)
g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
g.set_global_opts(title_opts=opts.TitleOpts(title="北京-酒店地址分布"))
g.render("酒店地址分布.html")
運(yùn)行效果如下:
三、柱形圖
代碼如下:
from?pyecharts.charts?import?Bar
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?ThemeType,?CurrentConfig
from?pyecharts?import?options?as?opts
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
#?鏈?zhǔn)秸{(diào)用
c?=?(
????Bar(
????????init_opts=opts.InitOpts(???????????#?初始配置項(xiàng)
????????????theme=ThemeType.MACARONS,
????????????animation_opts=opts.AnimationOpts(
????????????????animation_delay=1000,?animation_easing="cubicOut"???#?初始動(dòng)畫(huà)延遲和緩動(dòng)效果
????????????))
????????)
????.add_xaxis(xaxis_data=Faker.choose())??????#?x軸
????.add_yaxis(series_name="商家A",?yaxis_data=Faker.values())???????#?y軸
????.add_yaxis(series_name="商家B",?yaxis_data=Faker.values())???????#?y軸
????.set_global_opts(
????????title_opts=opts.TitleOpts(title='標(biāo)題',?subtitle='副標(biāo)題',???#?標(biāo)題配置和調(diào)整位置
??????????????????????????????????title_textstyle_opts=opts.TextStyleOpts(
??????????????????????????????????font_family='SimHei',?font_size=25,?font_weight='bold',?color='red',
??????????????????????????????????),?pos_left="90%",?pos_top="10",
??????????????????????????????????),
????????xaxis_opts=opts.AxisOpts(name='x軸名稱(chēng)',?axislabel_opts=opts.LabelOpts(rotate=45)),??#?設(shè)置x名稱(chēng)和Label?rotate解決標(biāo)簽名字過(guò)長(zhǎng)使用
????????yaxis_opts=opts.AxisOpts(name='y軸名稱(chēng)'),
????)
????.render("bar_001.html")
)
運(yùn)行效果如下:

代碼如下:
import?pandas?as?pd
import?collections
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Bar
from?pyecharts.globals?import?ThemeType,?CurrentConfig
import?random
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
df?=?pd.read_excel("hotel.xlsx")
area?=?list(df['酒店地址'])
area_list?=?[]
for?i?in?area:
????_index?=?i.find("區(qū)")
????#?字符串切片得到行政區(qū)名
????i?=?i[:_index?+?1]
????area_list.append(i)
area_count?=?collections.Counter(area_list)
area_dic?=?dict(area_count)
#?兩個(gè)列表對(duì)應(yīng)???行政區(qū)??對(duì)應(yīng)的酒店數(shù)量
area?=?[x?for?x?in?list(area_dic.keys())][0:10]
nums?=?[y?for?y?in?list(area_dic.values())][:10]
#?定制風(fēng)格
bar?=?Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
colors?=?['red',?'#0000CD',?'#000000',?'#008000',?'#FF1493',?'#FFD700',?'#FF4500',?'#00FA9A',?'#191970',?'#9932CC']
random.shuffle(colors)
#?配置y軸數(shù)據(jù)??Baritem
y?=?[]
for?i?in?range(10):
????y.append(
????????opts.BarItem(
????????????value=nums[i],
????????????itemstyle_opts=opts.ItemStyleOpts(color=colors[i])???#?設(shè)置每根柱子的顏色
????????)
????)
bar.add_xaxis(xaxis_data=area)
bar.add_yaxis("酒店數(shù)量",?yaxis_data=y)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(
????????????????????????????????????name='行政區(qū)',
????????????????????????????????????axislabel_opts=opts.LabelOpts(rotate=45)
????????????????????????????????????),
????????????????????yaxis_opts=opts.AxisOpts(
????????????????????????????????????name='酒店數(shù)量',?min_=0,?max_=330,?????#?y軸刻度的最小值?最大值
????????????????????),
????????????????????title_opts=opts.TitleOpts(
????????????????????????title="行政區(qū)-酒店數(shù)量",
????????????????????????title_textstyle_opts=opts.TextStyleOpts(
????????????????????????????font_family="KaiTi",?font_size=25,?color="black"
????????????????????????)
????????????????????))
#?標(biāo)記最大值??最小值??平均值???標(biāo)記平均線
bar.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="最小值"),
????????????????????????opts.MarkPointItem(type_="average",?name="平均值")]),
????????????????????markline_opts=opts.MarkLineOpts(
????????????????????data=[
????????????????????????opts.MarkLineItem(type_="average",?name="平均值")]))
bar.render("行政區(qū)酒店數(shù)量最多的Top10.html")
運(yùn)行效果如下:

代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Bar
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?ThemeType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
????.add_xaxis(xaxis_data=Faker.days_attrs)
????.add_yaxis("商家A",?yaxis_data=Faker.days_values)
????.set_global_opts(
????????title_opts=opts.TitleOpts(title="Bar-DataZoom(slider+inside)"),
????????datazoom_opts=[opts.DataZoomOpts(),?opts.DataZoomOpts(type_="inside")],
????)
????.render("bar_datazoom_both.html")
)
運(yùn)行效果如下:

四、餅圖
代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(Faker.choose(),?Faker.values())],
????????#?餅圖的中心(圓心)坐標(biāo),數(shù)組的第一項(xiàng)是橫坐標(biāo),第二項(xiàng)是縱坐標(biāo)
????????#?默認(rèn)設(shè)置成百分比,設(shè)置成百分比時(shí)第一項(xiàng)是相對(duì)于容器寬度,第二項(xiàng)是相對(duì)于容器高度
????????center=["35%",?"50%"],
????)
????.set_colors(["blue",?"green",?"yellow",?"red",?"pink",?"orange",?"purple"])???#?設(shè)置顏色
????.set_global_opts(
????????title_opts=opts.TitleOpts(title="Pie-設(shè)置顏色-調(diào)整圖例位置"),
????????legend_opts=opts.LegendOpts(type_="scroll",?pos_left="70%",?orient="vertical"),??#?調(diào)整圖例位置
????)
????.set_series_opts(label_opts=opts.LabelOpts(formatter=":?{c}"))
????.render("pie_set_color.html")
)
運(yùn)行效果如下:

代碼如下:
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
x_data?=?["深度學(xué)習(xí)",?"數(shù)據(jù)分析",?"Web開(kāi)發(fā)",?"爬蟲(chóng)",?"圖像處理"]
y_data?=?[688,?888,?560,?388,?480]
data_pair?=?[list(z)?for?z?in?zip(x_data,?y_data)]
data_pair.sort(key=lambda?x:?x[1])
c?=?(
????#?寬??高??背景顏色
????Pie(init_opts=opts.InitOpts(width="1200px",?height="800px",?bg_color="#2c343c"))
????.add(
????????series_name="學(xué)習(xí)方向",????#?系列名稱(chēng)
????????data_pair=data_pair,??????#?系列數(shù)據(jù)項(xiàng),格式為?[(key1,?value1),?(key2,?value2)]
????????rosetype="radius",????????# radius:扇區(qū)圓心角展現(xiàn)數(shù)據(jù)的百分比,半徑展現(xiàn)數(shù)據(jù)的大小
????????radius="55%",?????????????#?餅圖的半徑
????????center=["50%",?"50%"],????#?餅圖的中心(圓心)坐標(biāo),數(shù)組的第一項(xiàng)是橫坐標(biāo),第二項(xiàng)是縱坐標(biāo)
????????label_opts=opts.LabelOpts(is_show=False,?position="center"),???#??標(biāo)簽配置項(xiàng)
????)
????.set_global_opts(
????????title_opts=opts.TitleOpts(
????????????title="Customized?Pie",
????????????pos_left="center",
????????????pos_top="20",
????????????title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
????????),
????????legend_opts=opts.LegendOpts(is_show=False),
????)
????.set_series_opts(
????????tooltip_opts=opts.TooltipOpts(
????????????trigger="item",?formatter="{a}?
:?{c}?(go7utgvlrp%)"??#?'item':?數(shù)據(jù)項(xiàng)圖形觸發(fā),主要在散點(diǎn)圖,餅圖等無(wú)類(lèi)目軸的圖表中使用
?????????),
????????label_opts=opts.LabelOpts(color="rgba(255,?255,?255,?0.3)"),
????)
????.render("customized_pie.html")
)
運(yùn)行效果如下:

五、環(huán)圖
代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(Faker.choose(),?Faker.values())],
????????#?餅圖的半徑,數(shù)組的第一項(xiàng)是內(nèi)半徑,第二項(xiàng)是外半徑
????????#?默認(rèn)設(shè)置成百分比,相對(duì)于容器高寬中較小的一項(xiàng)的一半
????????radius=["40%",?"60%"],
????)
????.set_colors(["blue",?"green",?"????#800000",?"red",?"#000000",?"orange",?"purple"])
????.set_global_opts(
????????title_opts=opts.TitleOpts(title="Pie-Radius"),
????????legend_opts=opts.LegendOpts(orient="vertical",?pos_top="15%",?pos_left="2%"),
????)
????.set_series_opts(label_opts=opts.LabelOpts(formatter=":?{c}"))
????.render("pie_radius.html")
)
運(yùn)行效果如下:

代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(Faker.choose(),?Faker.values())],
????????radius=["40%",?"60%"],
????????label_opts=opts.LabelOpts(
????????????position="outside",
????????????formatter="{a|{a}}{abg|}\n{hr|}\n?{b|:?}{c}??{per|go7utgvlrp%}??",
????????????background_color="#eee",
????????????border_color="#aaa",
????????????border_width=1,
????????????border_radius=4,
????????????rich={
????????????????"a":?{"color":?"#999",?"lineHeight":?22,?"align":?"center"},
????????????????"abg":?{
????????????????????"backgroundColor":?"#e3e3e3",
????????????????????"width":?"100%",
????????????????????"align":?"right",
????????????????????"height":?22,
????????????????????"borderRadius":?[4,?4,?0,?0],
????????????????},
????????????????"hr":?{
????????????????????"borderColor":?"#aaa",
????????????????????"width":?"100%",
????????????????????"borderWidth":?0.5,
????????????????????"height":?0,
????????????????},
????????????????"b":?{"fontSize":?16,?"lineHeight":?33},
????????????????"per":?{
????????????????????"color":?"#eee",
????????????????????"backgroundColor":?"#334455",
????????????????????"padding":?[2,?4],
????????????????????"borderRadius":?2,
????????????????},
????????????},
????????),
????)
????.set_global_opts(title_opts=opts.TitleOpts(title="Pie-富文本示例"))
????.render("pie_rich_label.html")
)
運(yùn)行效果如下:

六、玫瑰圖
代碼如下:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.faker?import?Faker
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
labels?=?['可樂(lè)',?'雪碧',?'橙汁',?'奶茶',?'冰啤酒',?'檸檬水']
values?=?[6,?12,?28,?52,?72,?96]
v?=?Faker.choose()
c?=?(
????Pie()
????.add(
????????"",
????????[list(z)?for?z?in?zip(v,?Faker.values())],
????????radius=["40%",?"75%"],
????????center=["22%",?"50%"],
????????rosetype="radius",
????????label_opts=opts.LabelOpts(is_show=False),
????)
????.add(
????????"",
????????[list(z)?for?z?in?zip(labels,?values)],
????????radius=["40%",?"75%"],
????????center=["70%",?"50%"],
????????rosetype="area",
????)
????.set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰圖示例"),
?????????????????????legend_opts=opts.LegendOpts(is_show=False)
?????????????????????)
????.render("pie_rosetype.html")
)

from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Pie
from?pyecharts.globals?import?CurrentConfig
import?pandas?as?pd
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
provinces?=?['北京','上海','黑龍江','吉林','遼寧','內(nèi)蒙古','新疆','西藏','青海','四川','云南','陜西','重慶',
?????????????'貴州','廣西','海南','澳門(mén)','湖南','江西','福建','安徽','浙江','江蘇','寧夏','山西','河北','天津']
num?=?[1,1,1,17,9,22,23,42,35,7,20,21,16,24,16,21,37,12,13,14,13,7,22,8,16,13,13]
color_series?=?['#FAE927','#E9E416','#C9DA36','#9ECB3C','#6DBC49',
????????????????'#37B44E','#3DBA78','#14ADCF','#209AC9','#1E91CA',
????????????????'#2C6BA0','#2B55A1','#2D3D8E','#44388E','#6A368B'
????????????????'#7D3990','#A63F98','#C31C88','#D52178','#D5225B',
????????????????'#D02C2A','#D44C2D','#F57A34','#FA8F2F','#D99D21',
????????????????'#CF7B25','#CF7B25','#CF7B25']
#?創(chuàng)建DataFrame
df?=?pd.DataFrame({'provinces':?provinces,?'num':?num})
#?降序排序
df.sort_values(by='num',?ascending=False,?inplace=True)
#?提取數(shù)據(jù)
v?=?df['provinces'].values.tolist()
d?=?df['num'].values.tolist()
#?繪制餅圖
pie1?=?Pie(init_opts=opts.InitOpts(width='1250px',?height='750px'))
#?設(shè)置顏色
pie1.set_colors(color_series)
pie1.add("",?[list(z)?for?z?in?zip(v,?d)],
????????radius=["30%",?"100%"],
????????center=["50%",?"50%"],
????????rosetype="area"
????????)
#?設(shè)置全局配置項(xiàng)
pie1.set_global_opts(title_opts=opts.TitleOpts(title='多省區(qū)市\(zhòng)n確診病例連續(xù)多日',subtitle='零新增',
???????????????????????????????????????????????title_textstyle_opts=opts.TextStyleOpts(font_size=25,color=?'#0085c3'),
???????????????????????????????????????????????subtitle_textstyle_opts=?opts.TextStyleOpts(font_size=50,color=?'#003399'),
???????????????????????????????????????????????pos_right=?'center',pos_left=?'center',pos_top='42%',pos_bottom='center'
??????????????????????????????????????????????),
?????????????????????legend_opts=opts.LegendOpts(is_show=False),
?????????????????????toolbox_opts=opts.ToolboxOpts())
#?設(shè)置系列配置項(xiàng)
pie1.set_series_opts(label_opts=opts.LabelOpts(is_show=True,?position="inside",?font_size=12,
???????????????????????????????????????????????formatter=":{c}天",?font_style="italic",
???????????????????????????????????????????????font_weight="bold",?font_family="SimHei"
???????????????????????????????????????????????),
?????????????????????)
#?渲染在html頁(yè)面上
pie1.render('南丁格爾玫瑰圖示例.html')
運(yùn)行效果如下:

七、詞云圖
詞云就是通過(guò)形成關(guān)鍵詞云層或關(guān)鍵詞渲染,過(guò)濾掉大量的文本信息,對(duì)網(wǎng)絡(luò)文本中出現(xiàn)頻率較高的關(guān)鍵詞的視覺(jué)上的突出。
import?jieba
import?collections
import?re
from?pyecharts.charts?import?WordCloud
from?pyecharts.globals?import?SymbolType
from?pyecharts?import?options?as?opts
from?pyecharts.globals?import?ThemeType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
with?open('barrages.txt')?as?f:
????data?=?f.read()
#?文本預(yù)處理??去除一些無(wú)用的字符???只提取出中文出來(lái)
new_data?=?re.findall('[\u4e00-\u9fa5]+',?data,?re.S)??#?只要字符串中的中文
new_data?=?"?".join(new_data)
#?文本分詞--精確模式
seg_list_exact?=?jieba.cut(new_data,?cut_all=False)
result_list?=?[]
with?open('stop_words.txt',?encoding='utf-8')?as?f:
????con?=?f.readlines()
????stop_words?=?set()
????for?i?in?con:
????????i?=?i.replace("\n",?"")???#?去掉讀取每一行數(shù)據(jù)的\n
????????stop_words.add(i)
for?word?in?seg_list_exact:
????#?設(shè)置停用詞并去除單個(gè)詞
????if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)
#?篩選后統(tǒng)計(jì)
word_counts?=?collections.Counter(result_list)
#?獲取前100最高頻的詞
word_counts_top100?=?word_counts.most_common(100)
#?打印出來(lái)看看統(tǒng)計(jì)的詞頻
print(word_counts_top100)
#?鏈?zhǔn)秸{(diào)用
c?=?(
????WordCloud(
????????init_opts=opts.InitOpts(width='1350px',?height='750px',?theme=ThemeType.MACARONS)
????)
????.add(
????????series_name="詞頻",???????????????#?系列名稱(chēng)
????????data_pair=word_counts_top100,???#?系列數(shù)據(jù)項(xiàng)?[(word1,?count1),?(word2,?count2)]
????????word_size_range=[15,?108],??????#?單詞字體大小范圍
????????textstyle_opts=opts.TextStyleOpts(?????#?詞云圖文字的配置
????????????font_family='KaiTi',
????????),
????????shape=SymbolType.DIAMOND,??#?詞云圖輪廓,有?'circle',?'cardioid',?'diamond',?'triangle-forward',?'triangle',?'pentagon',?'star'?可選
????????pos_left='100',??#?距離左側(cè)的距離
????????pos_top='50',????#?距離頂部的距離
????)
????.set_global_opts(
????????title_opts=opts.TitleOpts(???????????#?標(biāo)題配置項(xiàng)
????????????title='彈幕詞云圖',
????????????title_textstyle_opts=opts.TextStyleOpts(
????????????????font_family='SimHei',
????????????????font_size=25,
????????????????color='black'
????????????),
????????????pos_left='500',
????????????pos_top='10',
????????),
????????tooltip_opts=opts.TooltipOpts(???????#?提示框配置項(xiàng)
????????????is_show=True,
????????????background_color='red',
????????????border_color='yellow',
????????),
????????toolbox_opts=opts.ToolboxOpts(???????#?工具箱配置項(xiàng)
????????????is_show=True,
????????????orient='vertical',
????????)
????)
????.render('彈幕詞云圖.html')
)
運(yùn)行效果如下:

八、儀表盤(pán)
from?pyecharts.charts?import?Gauge
from?pyecharts.globals?import?CurrentConfig
from?pyecharts?import?options?as?opts
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
c?=?(
????Gauge()
????.add(
????????series_name='業(yè)務(wù)指標(biāo)',????????????#?系列名稱(chēng),用于 tooltip 的顯示,legend 的圖例篩選。
????????data_pair=[['完成率',?88.8]],??????#?系列數(shù)據(jù)項(xiàng),格式為?[(key1,?value1),?(key2,?value2)]
????????radius='70%',??????????????????????#?儀表盤(pán)半徑,可以是相對(duì)于容器高寬中較小的一項(xiàng)的一半的百分比,也可以是絕對(duì)的數(shù)值。
????????axisline_opts=opts.AxisLineOpts(
????????????linestyle_opts=opts.LineStyleOpts(??#?坐標(biāo)軸軸線配置項(xiàng)
????????????????color=[(0.3,?"#67e0e3"),?(0.7,?"#37a2da"),?(1,?"#fd666d")],
????????????????width=30,
????????????)
????????),
????????title_label_opts=opts.LabelOpts(??????????#?輪盤(pán)內(nèi)標(biāo)題文本項(xiàng)標(biāo)簽配置項(xiàng)
????????????font_size=25,?color='blue',?font_family='KaiTi'
????????)
????)
????.set_global_opts(
????????title_opts=opts.TitleOpts(??????????#?標(biāo)題配置項(xiàng)
????????????title='儀表盤(pán)',
????????????title_textstyle_opts=opts.TextStyleOpts(
????????????????font_size=25,?font_family='SimHei',
????????????????color='black',?font_weight='bold',
????????????),
????????pos_left="410",?pos_top="8",
????????),
????????legend_opts=opts.LegendOpts(????????#?圖例配置項(xiàng)
????????????is_show=False
????????),
????????tooltip_opts=opts.TooltipOpts(?????????#?提示框配置項(xiàng)
????????????is_show=True,
????????????formatter="{a}?
?:?{c}%",
????????)
????)
????.render('gauge.html')
)
運(yùn)行效果如下:

九、水球圖
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Grid,?Liquid
from?pyecharts.commons.utils?import?JsCode
from?pyecharts.globals?import?CurrentConfig,?ThemeType
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
lq_1?=?(
????Liquid()
????.add(
????????series_name='電量',????????#?系列名稱(chēng),用于 tooltip 的顯示,legend 的圖例篩選。
????????data=[0.25],???????????????#?系列數(shù)據(jù),格式為?[value1,?value2,?....]
????????center=['60%',?'50%'],
????????#?水球外形,有' circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'?可選。
????????#?默認(rèn)?'circle'???也可以為自定義的?SVG?路徑
????????shape='circle',
????????color=['yellow'],??????????#?波浪顏色???Optional[Sequence[str]]?=?None,
????????is_animation=True,?????????#?是否顯示波浪動(dòng)畫(huà)
????????is_outline_show=False,?????#?是否顯示邊框
????)
????.set_global_opts(title_opts=opts.TitleOpts(title='多個(gè)Liquid顯示'))
)
lq_2?=?(
????Liquid()
????.add(
????????series_name='數(shù)據(jù)精度',
????????data=[0.8866],
????????center=['25%',?'50%'],
????????label_opts=opts.LabelOpts(
????????????font_size=50,
????????????formatter=JsCode(
????????????????"""function?(param)?{
????????????????????????return?(Math.floor(param.value?*?10000)?/?100)?+?'%';
????????????????????}"""
????????????),
????????????position='inside'
????????)
????)
)
grid?=?Grid(init_opts=opts.InitOpts(theme=ThemeType.DARK)).add(lq_1,?grid_opts=opts.GridOpts()).add(lq_2,?grid_opts=opts.GridOpts())
grid.render("multiple_liquid.html")
運(yùn)行效果如下:

數(shù)據(jù)獲取
數(shù)據(jù)來(lái)源:http://www.tianqihoubao.com/aqi/chengdu-201901.html
爬取2019年全年成都空氣質(zhì)量數(shù)據(jù)
import?pandas?as?pd
dates?=?pd.date_range('20190101',?'20191201',?freq='MS').strftime('%Y%m')???#?構(gòu)造出日期序列??便于之后構(gòu)造url
for?i?in?range(len(dates)):
????df?=?pd.read_html(f'http://www.tianqihoubao.com/aqi/chengdu-{dates[i]}.html',?encoding='gbk',?header=0)[0]
????if?i?==?0:
????????df.to_csv('2019年成都空氣質(zhì)量數(shù)據(jù).csv',?mode='a+',?index=False)?????#?追加寫(xiě)入
????????i?+=?1
????else:
????????df.to_csv('2019年成都空氣質(zhì)量數(shù)據(jù).csv',?mode='a+',?index=False,?header=False)
查看爬取的數(shù)據(jù)

十、折線圖
折線圖是排列在工作表的列或行中的數(shù)據(jù)可以繪制到折線圖中。折線圖可以顯示隨時(shí)間(根據(jù)常用比例設(shè)置)而變化的連續(xù)數(shù)據(jù),因此非常適用于顯示在相等時(shí)間間隔下數(shù)據(jù)的趨勢(shì)。
繪制2019年成都AQI指數(shù)走勢(shì)圖
import?pandas?as?pd
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Line
from?pyecharts.globals?import?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
df?=?pd.read_csv('2019年成都空氣質(zhì)量數(shù)據(jù).csv')
date?=?[x?for?x?in?range(len(df['日期']))]
value?=?[int(i)?for?i?in?df['AQI指數(shù)']]
#?繪制折線圖
line?=?Line()
line.add_xaxis(xaxis_data=date)
line.add_yaxis(
????"AQI指數(shù)",???????#?系列數(shù)據(jù)項(xiàng)
????value,???????????#?y軸數(shù)據(jù)
????areastyle_opts=opts.AreaStyleOpts(opacity=0.5,?color='#00FFFF'),??#?設(shè)置圖形透明度??填充顏色
????label_opts=opts.LabelOpts(is_show=False),???#?標(biāo)簽配置項(xiàng)
????markpoint_opts=opts.MarkPointOpts(??????????#?標(biāo)記點(diǎn)配置項(xiàng)
????????data=[
????????????????opts.MarkPointItem(type_="max",?name="最大值"),
????????????????opts.MarkPointItem(type_="min",?name="最小值"),
????????????????opts.MarkPointItem(type_="average",?name="平均值")
????????]
????),
????markline_opts=opts.MarkLineOpts(????????????#?標(biāo)記線配置項(xiàng)
????????data=[opts.MarkLineItem(type_="average",?name="平均值")])
)
line.set_global_opts(
????title_opts=opts.TitleOpts(title='2019成都AQI指數(shù)走勢(shì)圖(按日統(tǒng)計(jì))')
)
line.render('2019成都AQI指數(shù)走勢(shì)圖(按日統(tǒng)計(jì)).html')
運(yùn)行效果如下:

import?pandas?as?pd
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Line
from?pyecharts.globals?import?CurrentConfig,?ThemeType
import?math
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
df?=?pd.read_csv('2019年成都空氣質(zhì)量數(shù)據(jù).csv')[['日期',?'AQI指數(shù)']]
data?=?df['日期'].str.split('-',?expand=True)[1]
df['月份']?=?data
#?按月份分組?聚合?統(tǒng)計(jì)每月AQI指數(shù)平均值
counts?=?df.groupby('月份').agg({'AQI指數(shù)':?'mean'})
date?=?[f'{x}月'?for?x?in?range(1,?13)]
value?=?[math.ceil(i)?for?i?in?counts['AQI指數(shù)']]
line?=?Line(init_opts=opts.InitOpts(theme=ThemeType.DARK))
line.set_colors(['red'])
line.add_xaxis(xaxis_data=date)
line.add_yaxis(
????"AQI指數(shù)均值",????#?系列數(shù)據(jù)項(xiàng)???用于圖例篩選
????value,????????????#?y軸數(shù)據(jù)
????label_opts=opts.LabelOpts(is_show=False),
????markpoint_opts=opts.MarkPointOpts(????#?標(biāo)記點(diǎn)配置項(xiàng)
????????data=[
????????????????opts.MarkPointItem(type_="max",?name="最大值"),
????????????????opts.MarkPointItem(type_="min",?name="最小值"),
????????????????opts.MarkPointItem(type_="average",?name="平均值")
????????]
????),
????markline_opts=opts.MarkLineOpts(?????????#?標(biāo)記線配置項(xiàng)
????????data=[opts.MarkLineItem(type_="average",?name="平均值")])
)
line.set_global_opts(??????#?全局配置項(xiàng)
????title_opts=opts.TitleOpts(
????????title='2019成都AQI全年走勢(shì)圖(按月統(tǒng)計(jì))',
????????pos_left='32%',?pos_top='3%',
????????title_textstyle_opts=opts.TextStyleOpts(
????????????font_family='SimHei',?font_size=20,?color='#F0FFF0'
????????)
????),
????xaxis_opts=opts.AxisOpts(name='月份'),??????????#?x軸標(biāo)簽
????yaxis_opts=opts.AxisOpts(name='AQI指數(shù)均值')????#?y軸標(biāo)簽
)
line.render('2019成都AQI指數(shù)走勢(shì)圖(按月統(tǒng)計(jì)).html')
運(yùn)行效果如下:

十一、箱形圖
箱形圖(Box-plot)又稱(chēng)為盒須圖、盒式圖或箱線圖,是一種用作顯示一組數(shù)據(jù)分散情況資料的統(tǒng)計(jì)圖。因形狀如箱子而得名。在各種領(lǐng)域也經(jīng)常被使用,常見(jiàn)于品質(zhì)管理。它主要用于反映原始數(shù)據(jù)分布的特征,還可以進(jìn)行多組數(shù)據(jù)分布特征的比 較。箱線圖的繪制方法是:先找出一組數(shù)據(jù)的上邊緣、下邊緣、中位數(shù)和兩個(gè)四分位數(shù);然后, 連接兩個(gè)四分位數(shù)畫(huà)出箱體;再將上邊緣和下邊緣與箱體相連接,中位數(shù)在箱體中間。

import?pandas?as?pd
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Boxplot
from?pyecharts.globals?import?CurrentConfig,?ThemeType
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
df?=?pd.read_csv('2019年成都空氣質(zhì)量數(shù)據(jù).csv')[['日期',?'AQI指數(shù)']]
df.sort_values(by='AQI指數(shù)',?inplace=True)?????#?按AQI指數(shù)大小排序?升序
data?=?df['日期'].str.split('-',?expand=True)[1]
df['月份']?=?data
item1,?item2,?item3,?item4?=?[],?[],?[],?[]
#?分為4個(gè)季度
for?i,?j?in?zip(df['月份'],?df['AQI指數(shù)']):
????if?i?in?['01',?'02',?'03']:
????????item1.append(j)
????elif?i?in?['04',?'05',?'06']:
????????item2.append(j)
????elif?i?in?['07',?'08',?'09']:
????????item3.append(j)
????elif?i?in?['10',?'11',?'12']:
????????item4.append(j)
x_data?=?[f'第{i}季度'?for?i?in?range(1,?5)]
y_data?=?[item1,?item2,?item3,?item4]
boxplot?=?Boxplot(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
boxplot.set_colors(['red'])
boxplot.add_xaxis(xaxis_data=x_data)
boxplot.add_yaxis(series_name='',?y_axis=boxplot.prepare_data(y_data))
boxplot.set_global_opts(
????title_opts=opts.TitleOpts(
????????title='2019年成都季度AQI指數(shù)箱型圖',
????????pos_left='300',?pos_top='5',
????????title_textstyle_opts=opts.TextStyleOpts(
????????????font_family='KaiTi',?font_size=20,?color='black'
????????)
????),
????xaxis_opts=opts.AxisOpts(name='季度'),
????yaxis_opts=opts.AxisOpts(name='AQI指數(shù)')
)
boxplot.render('2019年成都季度AQI指數(shù)箱型圖.html')
運(yùn)行效果如下:

由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
(1)點(diǎn)擊頁(yè)面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁(yè)。
(2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁(yè)面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝支持,比心。

