Pyechart:30分钟学会pyecharts数据可视化
30分鐘學(xué)會pyecharts數(shù)據(jù)可視化
小紅:你先跟我說說什么是pyecharts吧。
?
小明:Echarts 是一個由百度開源的數(shù)據(jù)可視化javascript庫,憑借著良好的交互性,精巧的圖表設(shè)計,得到了眾多開發(fā)者的認可。而 Python 是一門富有表達力的語言,很適合用于數(shù)據(jù)處理。當數(shù)據(jù)分析遇上數(shù)據(jù)可視化時,pyecharts誕生了。簡單地說,pyecharts就是百度開源的一個強大的javascript數(shù)據(jù)可視化庫Echarts的python接口。
?
小紅:明白,那這個pyecharts要怎么安裝呢?
?
小明:很簡單,用pip就可以安裝了。下面是在jupyter notebook中安裝這個庫的一個示范。
?
#?安裝pyecharts!pip?install?pyecharts==0.5.11
#?pyecharts_snapshot?提供圖片導(dǎo)出功能
!pip?install?pyecharts_snapshot
??
一,基本圖表
?
小紅:好了,我已經(jīng)安裝成功了。你可不可以給我舉一些常用圖表的范例。
?
小明:OK,在數(shù)據(jù)分析中最常用的3種圖表就是柱形圖,折線圖和散點圖了。下面我們就來看一下pyecharts繪制這3種常用圖表的范例吧。
?
1,柱形圖
??
柱形圖適合表現(xiàn)幾組數(shù)據(jù)之間的對比關(guān)系,柱形圖表現(xiàn)的數(shù)據(jù)的數(shù)量一般不宜太多,多了的話會像一堆雜草。
?
from??pyecharts?import?Barx?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋"]
y1?=?[5,?20,?36,?10,?75]
y2?=?[10,?25,?8,?60,?20]
bar?=?Bar(title?=?"產(chǎn)品月銷量",width?=?600,height?=?420)
bar.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1)
bar.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,is_xaxis_boundarygap?=True)
#?導(dǎo)出繪圖html文件,可直接用瀏覽器打開
bar.render('柱形圖示范.html')
bar
? ?
2,折線圖
?
折線圖適合描述兩個變量之間的函數(shù)關(guān)系,例如常用它來描述一個變量隨時間的變化趨勢。
?
from??pyecharts?import?Linex?=?['2018-{:0>2d}'.format(s)?for?s?in?range(1,13)]
y1?=?[5,10,26,30,35,30,20,26,40,46,40,50]
y2?=?[8,20,24,36,40,36,40,45,50,53,48,58]
line?=?Line(title?=?"月銷售總額",width?=?600,height?=?420)
line.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1,
?????????line_width?=?3,line_color?=?'red')
line.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,
?????????yaxis_min?=?0,yaxis_max?=?100,is_xaxis_boundarygap?=?False,
?????????is_datazoom_show?=True,line_width?=?2,line_color?=?'cyan')
line.render('折線圖示范.html')
line
??
3,散點圖
散點圖適合表現(xiàn)大量樣本的多個屬性的分布規(guī)律。散點圖的每個點表示一個樣本,每個坐標維度表示一個屬性。
?
from?pyecharts?import?Scatterimport?pandas?as?pd?
dfboy?=?pd.DataFrame()
dfboy['weight']?=?[56,67,65,70,57,60,80,85,76,64]
dfboy['height']?=?[162,170,168,172,168,172,180,176,178,170]
dfgirl?=?pd.DataFrame()
dfgirl['weight']?=?[50,62,60,70,57,45,62,65,70,56]
dfgirl['height']?=?[155,162,165,170,166,158,160,170,172,165]
scatter?=?Scatter(title?=?"體格數(shù)據(jù)",width?=?600,height?=?420)
scatter.add(name?=?"boy",?x_axis?=?dfboy['weight'],?y_axis?=?dfboy['height'])
scatter.add(name?=?"girl",?x_axis?=?dfgirl['weight'],?y_axis?=?dfgirl['height'],
???????????yaxis_min?=?130,yaxis_max?=?200,xaxis_min?=?30,xaxis_max?=?100)
scatter.render("散點圖示范.html")
scatter
?
當樣本屬性維度多于2個時,散點圖可以使用點的顏色或大小等方式來表達更多屬性維度。下面示范使用點的大小表示第3個維度。
?
from?pyecharts?import?Scatterimport?pandas?as?pd?
def?custom_formatter(params):
????return?(params.value[3]?+?':'?+
?????????????str(params.value[0])?+','
?????????????+str(params.value[1])?+?','
?????????????+str(params.value[2]))
df?=?pd.DataFrame()
df['country']?=?["中國",'美國','德國','法國','英國','日本','俄羅斯','印度','澳大利亞','加拿大']
df['life-expectancy']?=?[76.9,79.1,81.1,81.9,81.4,83.5,73.13,66.8,81.8,81.7]
df['capita-gdp']?=?[13334,53354,44053,37599,38225,36162,23038,5903,44056,43294]
df['population']?=?[1376048943,321773631,80688545,64395345,64715810,126573481,143456918,
????????????????????1311050527,23968973,35939927]
scatter?=?Scatter(title?=?"各國發(fā)展水平",width?=?600,height?=?420)
scatter.add(name?=?'',
????????????x_axis?=?df['capita-gdp'],??#?params.values[0]
????????????y_axis?=?df['life-expectancy'],?#?params.values[1]
????????????extra_data?=?df['population'].values.tolist(),?#?params.values[2]
????????????extra_name?=?df['country'].values.tolist(),?#?params.values[3]
????????????tooltip_formatter=custom_formatter,??#自定義提示框格式內(nèi)容
????????????is_visualmap=True,?
????????????visual_orient="horizontal",
????????????visual_type?=?'size',??#可以是size或者color
????????????visual_dimension=2,
????????????visual_range=[20000000,?1500000000],
???????????)
scatter
??
小紅:你上面說的這些范例大部分還是挺簡單的,可能這個用散點圖來顯示各個國家的發(fā)展水平的例子相對復(fù)雜一些,是不是如果有第3維數(shù)據(jù)就要用extra_data來傳入呢?然后用visual_dimension來指定用點的顏色或者點的大小表示的是第幾維的數(shù)據(jù)。這里的話,用點的大小表示了population也就是各個國家人口的多少。對嗎?
?
小明:一點也沒有錯,你可以仿照著這個例子試試用點的顏色來表示第3維度的數(shù)據(jù),應(yīng)該不難懂的。
?
小紅:棒棒的。除了這三種最常用圖表外。還有一些別的好用的表現(xiàn)力強的圖表可以推薦一些嗎?
?
小明:你還真是學(xué)而不厭。那我再給你演示一下箱型圖,詞云圖以及地理坐標系圖吧。
?
4,箱型圖
?
箱型圖適合表現(xiàn)一組數(shù)據(jù)的統(tǒng)計分布規(guī)律,它能顯示出一組數(shù)據(jù)的最大值、最小值、中位數(shù)、及上下四分位數(shù)。
箱型圖的進階版本是小提琴圖,可以展示數(shù)據(jù)的密度估計曲線,可以用seaborn畫出。
?
from?pyecharts?import?Boxplotx?=['1班','2班','3班','4班']
y1=[78,?98,?56,?78,?90.0,?45,?78,?20,?87,?86,?74,?89,?94]
y2=[89,?82,?45,?67,?68,?78.0,?79,?98,?71,?56,?78,?81,?80]
y3=[90,?80,?60,?89,?76,?73.0,?72,?92,?89,?87,?65,?66,?76]
y4=[82,?72,?55,?100,?90.0,?78,?69,?67,?87,?66,?78,?71,?82]
box?=?Boxplot(title?=?'考試成績箱型圖',width?=?600,height?=?420)
#?預(yù)處理數(shù)據(jù)計算最大值,最小值,中位數(shù)以及上下四分位數(shù)
y_prepared?=?box.prepare_data([y1,y2,y3,y4])?
box.add(name?=?'',x_axis?=?x,y_axis?=?y_prepared)
?
附:用seaborn 進行小提琴圖的繪制
?
import?seaborn?as?sns%matplotlib?inline
%config?InlineBackend.figure_format?=?'svg'
#設(shè)置風(fēng)格
sns.set(style="white",?context="notebook")
#處理中文問題
sns.set_style({'font.sans-serif':['simhei',?'Arial']})?
dfdata?=?pd.DataFrame()
dfdata['score']?=?y1?+?y2?+?y3?+?y4
dfdata['class']?=?['1班']*len(y1)+['2班']*len(y2)+['3班']*len(y3)+['4班']*len(y4)
ax?=?sns.violinplot(x=?'class',?y?=?'score',data?=?dfdata,
????????????palette?=?'hls',?#?設(shè)置調(diào)色板
????????????inner?=?'box'#?設(shè)置內(nèi)部顯示類型?→?“box”,?“quartile”,?“point”,?“stick”,?None
???????????)
??
5,詞云圖
?
詞云圖適合表現(xiàn)不同關(guān)鍵詞的出現(xiàn)頻率或重要性程度。
?
from?pyecharts?import?WordCloudwords?=?['python','jupyter','numpy','pandas','matplotlib','sklearn',
????????'xgboost','lightGBM','simpy','keras','tensorflow',
?????????'hive','hadoop','spark']
counts?=?[100,90,65,95,50,60,70,70,20,70,80,80,60,60]
cloud?=?WordCloud(title?=?'數(shù)據(jù)算法常用工具',width?=?600,height?=?420)
cloud.add(name?=?'utils',attr?=?words,value?=?counts,
??????????shape?=?"circle",word_size_range?=?(10,70))
cloud
?
6,地理坐標系圖
?
地理坐標系圖適合表現(xiàn)和國家,省份,以及城市,經(jīng)緯度位置相關(guān)聯(lián)的數(shù)據(jù)分布規(guī)律。
pyecharts中Geo表達和城市關(guān)聯(lián)的數(shù)據(jù),Map表達和國家和省份關(guān)聯(lián)的數(shù)據(jù)。
?
#?安裝地圖附屬包!pip?install?echarts-countries-pypkg
!pip?install?echarts-china-provinces-pypkg
!pip?install?echarts-china-cities-pypkg
?
#?全國城市地圖示例from?pyecharts?import?Geo
data?=?[
????("海門",?9),("鄂爾多斯",?12),("招遠",?12),("舟山",?12),("齊齊哈爾",?14),("鹽城",?15),
????("惠州",?37),("江陰",?37),("蓬萊",?37),("韶關(guān)",?38),("嘉峪關(guān)",?38),("廣州",?38),
????("張家港",?52),("三門峽",?53),("錦州",?54),("南昌",?54),("柳州",?54),("三亞",?54),
????("呼和浩特",?58),("成都",?58),("大同",?58),("鎮(zhèn)江",?59),("桂林",?59),("張家界",?59),
????("北京",?79),("徐州",?79),("衡水",?80),("包頭",?80),("綿陽",?80),("烏魯木齊",?84),
????("菏澤",?194),("合肥",?229),("武漢",?273),("大慶",?279)]
geo?=?Geo(
????"全國部分城市空氣質(zhì)量",
????title_color="#fff",
????title_pos="center",
????width=800,
????height=600,
????background_color="#404a59",
)
attr,?value?=?geo.cast(data)
geo.add(
????"",
????attr,
????value,
????visual_range=[0,?200],
????visual_text_color="#fff",
????symbol_size=15,
????is_visualmap=True,
)
geo
??
#??全國省份地圖from?pyecharts?import?Map
value?=?[155,?10,?66,?78,?44,?38,?88,?50,?20]
attr?=?["福建","山東","北京","上海","江西","新疆","內(nèi)蒙古","云南","重慶"]
m?=?Map("全國省份地圖",?width=600,?height=400)
m.add("",?attr,?value,?maptype='china',
????????is_visualmap=True,?
????????is_piecewise=True,
????????visual_text_color="#000",
????????visual_range_text=["",?""],
????????pieces=[
????????????{"max":?160,?"min":?81,?"label":?"高"},
????????????{"max":?80,?"min":?51,?"label":?"中"},
????????????{"max":?50,?"min":?0,?"label":?"低"},
????????])
m
??
#?世界地圖示例from?pyecharts?import?Map
countries=?["China",?"Canada",?"India",?"Russia",?"United?States","Japan"]
capita_gdp?=?[13334,?43294,?5903,?23038,?53354,36162]
population?=?[1376048943,?35939927,?1311050527,?143456918,?321773631,126573481]
life_expectancy?=?[76.9,81.7,66.8,73.13,79.1,73.13]
m?=?Map("世界經(jīng)濟發(fā)展水平",?width=800,?height=500)
m.add(
????"人均GDP",
????attr?=?countries,
????value?=?capita_gdp,
????maptype="world",
????is_visualmap=True,
????visual_range?=?[5000,60000],
????visual_text_color="#000",
????is_map_symbol_show=False,
????visual_orient="horizontal"
)
m
??
二,圖表配置
?
小紅:你上面介紹的這些基本圖表都蠻實用的,做起來好像也不難。但是如果我想對圖表尺寸,線型顏色,坐標軸刻度等一些細節(jié)進行調(diào)整,而不是采用默認配置,應(yīng)該怎么做呢?
?
小明:你說的這個叫做圖表配置。在pyecharts里有3種進行圖表配置的方法。
?
第一個是修改圖表主題風(fēng)格:利用configure或use_theme指定圖表主題風(fēng)格,對圖表整體顏色風(fēng)格產(chǎn)生影響。
?
第二個是初始化圖表通用屬性:在創(chuàng)建圖表時指定圖表height,title等屬性,對圖像尺寸和標題等通用屬性產(chǎn)生影響。
?
第三個是配置特定元素屬性:可以使用add給圖表配置xyAxis,datazoom,lineStyle等特定元素屬性。
?
1,修改圖表主題風(fēng)格
?
可以使用use_theme修改單個圖表主題,也可以用configure修改全局圖表風(fēng)格。
?
#?默認主題效果import?random
from?pyecharts?import?Bar
X_AXIS?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
bar?=?Bar("默認主題效果",?"這里是副標題")
bar.add("商家A",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家B",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家C",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家D",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar
?
#?使用dark主題import?random
from?pyecharts?import?Bar
X_AXIS?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
bar?=?Bar("dark主題展示",?"這里是副標題")
bar.use_theme("dark")
bar.add("商家A",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家B",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家C",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家D",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar
??
#?安裝主題插件獲取更多主題!pip?install?echarts-themes-pypkg
?
主題插件支持以下主題
-
vintage
-
macarons? 美
-
shine ? 美+++
-
roma ?? 美
-
westeros
-
wonderland
-
chalk
-
halloween? 美+
-
essos
-
walden
-
purple-passion
-
romantic
?
import?randomfrom?pyecharts?import?Bar
X_AXIS?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
bar?=?Bar("shine主題展示",?"這里是副標題")
bar.use_theme("shine")
bar.add("商家A",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家B",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家C",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar.add("商家D",?X_AXIS,?[random.randint(10,?100)?for?_?in?range(6)])
bar
??
如果要設(shè)置某個主題風(fēng)格應(yīng)用到所有圖表,可以在繪圖開始前用configure進行設(shè)置。
?
from?pyecharts?import?configure#?將這行代碼置于首部
configure(global_theme='shine')
from?pyecharts?import?Pie
attr?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
value?=?[11,?12,?13,?10,?10,?10]
pie?=?Pie("銷售額占比",width?=?800,height?=?520)
pie.add("",?attr,?value,?is_label_show=True)
?
2,修改圖表通用屬性
?
圖表通用屬性指的是圖表的title,subtitle,height,width,title_pos,title_color,title_text_size,background_color等屬性,這些屬性對所有類型的圖表都適用。
所有通用屬性設(shè)置方式詳細參見pyecharts的官方文檔:https://github.com/lyhue1991/pyecharts/blob/master/docs/zh-cn/charts_configure.md
?
from?pyecharts?import?Pieattr?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
value?=?[11,?12,?13,?10,?10,?10]
#?初始化圖表通用屬性
pie?=?Pie(title?=?"銷售額占比",
??????????title_pos?=?'center',?#?標題居中
??????????title_top?=?'bottom',?#?標題在底部
??????????title_color?=?'#0000ff',?#?標題顏色設(shè)置為藍色,256位rgb格式
??????????background_color?=?"#aee",?#?設(shè)置背景顏色,16位rgb格式
??????????width?=?600,height?=?420)
pie.add("",?attr,?value,?is_label_show=True)
??
3,配置特定元素屬性
?
特定元素屬性包括xyAxis,dataZoom,lineStyle,markLine-markPoint,visualMap等元素屬性,這些元素只在某些種類的圖表中適用。例如xyAxis只在Line、Bar、Scatter、EffectScatter、Kline這幾類圖表中適用。
?
所有特定元素屬性設(shè)置方式詳細參見官方文檔:https://github.com/lyhue1991/pyecharts/blob/master/docs/zh-cn/charts_configure.md
?
#?設(shè)置xyAxis示范from??pyecharts?import?Line
x?=?['2018-{:0>2d}'.format(s)?for?s?in?range(1,13)]
y1?=?[5,10,26,30,35,30,20,26,40,46,40,50]
y2?=?[8,20,24,36,40,36,40,45,50,53,48,58]
line?=?Line(title?=?"月銷售總額",width?=?600,height?=?420)
line.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1)
line.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,
?????????#
?????????#=====設(shè)置xyAxis=====
?????????yaxis_min?=?0,yaxis_max?=?100,??#?設(shè)置y坐標軸刻度范圍
?????????xaxis_name?=?'月份',?yaxis_name?=?'銷售額',?#x軸名稱,y軸名稱
?????????xaxis_name_gap?=??40,?#?x軸名稱與軸距離
?????????xaxis_rotate?=?30,??#?x軸刻度旋轉(zhuǎn)角度
?????????is_splitline_show?=?True,?#?顯示y軸網(wǎng)格線
?????????is_xaxislabel_align?=?True?#?x軸刻度和標簽是否對齊
????????)
line
??
#?設(shè)置dataZoom示范from??pyecharts?import?Line
x?=?['2018-{:0>2d}'.format(s)?for?s?in?range(1,13)]
y1?=?[5,10,26,30,35,30,20,26,40,46,40,50]
y2?=?[8,20,24,36,40,36,40,45,50,53,48,58]
line?=?Line(title?=?"月銷售總額",width?=?600,height?=?420)
line.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1)
line.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,
?????????#
?????????#=====設(shè)置xyAxis=====
?????????is_xaxis_boundarygap?=?False,??#?x坐標刻度對準數(shù)據(jù),而不是作為分類邊界
?????????#
?????????#=====設(shè)置dataZoom=====
?????????is_datazoom_show?=?True,?#顯示?dataZoom控制條
?????????datazoom_type?=?'both'?#?可以是slider,inside或both
?????????#
?????????#
????????)
line
??
#?設(shè)置lineStyle示范from??pyecharts?import?Line
x?=?['2018-{:0>2d}'.format(s)?for?s?in?range(1,13)]
y1?=?[5,10,26,30,35,30,20,26,40,46,40,50]
y2?=?[8,20,24,36,40,36,40,45,50,53,48,58]
line?=?Line(title?=?"月銷售總額",width?=?600,height?=?420)
line.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1,
?????????#
?????????#=====設(shè)置lineStyle=====
?????????line_width?=?2,
?????????line_opacity?=?0.5,?#?透明度
?????????line_color?=?'red'
????????)
line.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,
?????????#
?????????#=====設(shè)置xyAxis=====
?????????is_xaxis_boundarygap?=?False,??#?x坐標刻度對準數(shù)據(jù),而不是作為分類邊界
?????????#
?????????#=====設(shè)置dataZoom=====
?????????is_datazoom_show?=?True,?#顯示?dataZoom控制條
?????????#
?????????#=====設(shè)置lineStyle=====
?????????line_width?=?3,
?????????line_color?=?'#11ffbb',
?????????line_type?=?'dashed',?#?線型,可以是solid,dashed,或者dotted
????????)
line
??
#?設(shè)置markPoint和markLine示范from??pyecharts?import?Line
x?=?['2018-{:0>2d}'.format(s)?for?s?in?range(1,13)]
y1?=?[5,10,26,30,35,30,20,26,40,46,40,50]
y2?=?[8,20,24,36,40,36,40,45,50,53,48,58]
line?=?Line(title?=?"月銷售總額",width?=?600,height?=?420)
line.add(name?=?"商家A",?x_axis?=?x,?y_axis?=?y1,
?????????#
?????????#=====設(shè)置lineStyle=====
?????????line_width?=?2,
?????????line_opacity?=?0.5,?#?透明度
?????????line_color?=?'red',
?????????#
?????????#=====設(shè)置markPoint&markLine=====
?????????mark_point?=?['min','max'],?#標記點
?????????mark_line?=?['average']?#標記線
????????)
line.add(name?=?"商家B",?x_axis?=?x,?y_axis?=?y2,
?????????#
?????????#=====設(shè)置xyAxis=====
?????????is_xaxis_boundarygap?=?False,??#?x坐標刻度對準數(shù)據(jù),而不是作為分類邊界
?????????yaxis_min?=?0,yaxis_max?=?100,??#?設(shè)置y坐標軸刻度范圍
?????????#
?????????#=====設(shè)置dataZoom=====
?????????is_datazoom_show?=?True,?#顯示?dataZoom控制條
?????????#
?????????#=====設(shè)置lineStyle=====
?????????line_width?=?3,
?????????line_type?=?'dashed',?#?線型,可以是solid,dashed,或者dotted
?????????#=====設(shè)置markPoint&markLine=====
?????????mark_point?=?[{"coord":?['2018-09',?60],?"name":?"2018/09銷售目標"},?
??????????{"coord":?['2018-11',?80],?"name":?"2018/10銷售目標"}]??#?自定義標記點
????????)
line
??
如果需要反復(fù)使用相同的配置,可以使用Style類簡化這個過程。
?
from?pyecharts?import?Pie,Stylepie?=?Pie('各類電影中"好片"所占的比例',?"數(shù)據(jù)來自豆瓣",?title_pos='center')
style?=?Style()
pie_style?=?style.add(
????label_pos="center",
????is_label_show=True,
????label_text_color=None
)
pie.add(
????"",?["劇情",?""],?[25,?75],?center=[10,?30],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["奇幻",?""],?[24,?76],?center=[30,?30],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["愛情",?""],?[14,?86],?center=[50,?30],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["驚悚",?""],?[11,?89],?center=[70,?30],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["冒險",?""],?[27,?73],?center=[90,?30],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["動作",?""],?[15,?85],?center=[10,?70],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["喜劇",?""],?[54,?46],?center=[30,?70],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["科幻",?""],?[26,?74],?center=[50,?70],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["懸疑",?""],?[25,?75],?center=[70,?70],?radius=[18,?24],?**pie_style
)
pie.add(
????"",?["犯罪",?""],[28,?72],center=[90,?70],?radius=[18,?24],?legend_top="bottom",?
????**pie_style
)
pie
??
三,圖表組合
?
小紅:你上面展示的這些圖表配置的范例我基本上get到了,簡單地說,就是可以修改圖表主題,配置圖表通用屬性,以及配置特定元素屬性,找到相應(yīng)的范例參照來改就可以了。但有時候我想把多個不同類型的圖表畫在一張圖上,比如在一張圖上同時畫柱狀圖和折線圖,繪制包含多個子圖的圖表,pyecharts可以做到嗎?
?
小明:當然可以嘍。pyecharts可以利用圖表組合將多個基本圖表加工成內(nèi)容更加豐富,表現(xiàn)力更強的組合圖表。在pyecharts中對圖表進行組合的方式主要有:Grid, Overlap, Page, Timeline這四種方式。
?
1,Grid圖表組合
?
Grid圖表組合可以并行顯示多張圖,類似子圖的作用。Grid中的子圖可以是Overlap。
?
from?pyecharts?import?Bar,?Line,?Gridx?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
y1?=?[5,?20,?36,?10,?75,?90]
y2?=?[10,?25,?8,?60,?20,?80]
bar?=?Bar("柱狀圖示例",?height=720)
bar.add("商家A",?x,?y1,?is_stack=True)
bar.add("商家B",?x,?y2,?is_stack=True)
line?=?Line("折線圖示例",?title_top="50%")
x?=?["周一",?"周二",?"周三",?"周四",?"周五",?"周六",?"周日"]
line.add(
????"最高氣溫",
????x,
????[11,?11,?15,?13,?12,?13,?10],
????mark_point=["max",?"min"],
????mark_line=["average"],
)
line.add(
????"最低氣溫",
????x,
????[1,?-2,?2,?5,?3,?2,?0],
????mark_point=["max",?"min"],
????mark_line=["average"],
????legend_top="50%",
)
grid?=?Grid()
#利用grid_bottom,grid_top,grid_left,grid_right四個參數(shù)控制子圖的相對位置
grid.add(bar,?grid_bottom="60%")??
grid.add(line,?grid_top="60%")
grid
?
利用Grid解決dataZoom與X軸標簽重疊的問題
?
from?pyecharts?import?Bar,?Gridx?=?[
????"2019-01-01",
????"2019-01-02",
????"2019-01-03",
????"2019-01-04",
????"2019-01-05",
????"2019-01-06",
????"2019-01-07",
????"2019-01-08",
????"2019-01-09",
]
y?=?[10,?20,?30,?40,?50,?60,?70,?80,?90]
grid?=?Grid()
bar?=?Bar("利用?Grid?解決?dataZoom?與?X?軸標簽重疊問題")
bar.add("",?x,?y,?is_datazoom_show=True,?xaxis_interval=0,?xaxis_rotate=30)
#?把?bar?加入到?grid?中,并適當調(diào)整?grid_bottom?參數(shù),使?bar?圖整體上移
grid.add(bar,?grid_bottom="25%")
??
2,Overlap圖表組合
?
Overlap圖表組合可以將不同類型的圖表畫在同一張圖上。
?
from?pyecharts?import?Bar,?Line,?Overlapattr?=?['A',?'B',?'C',?'D',?'E',?'F']
v1?=?[10,?20,?30,?40,?50,?60]
v2?=?[38,?28,?58,?48,?78,?68]
bar?=?Bar("Line?-?Bar?示例")
bar.add("bar",?attr,?v1)
line?=?Line()
line.add("line",?attr,?v2)
overlap?=?Overlap()
overlap.add(bar)
overlap.add(line)
overlap
?
Overlap顯示雙坐標軸
?
from?pyecharts?import?Line,?Bar,?Overlapattr?=?["{}月".format(i)?for?i?in?range(1,?13)]
v1?=?[2.0,?4.9,?7.0,?23.2,?25.6,?76.7,?135.6,?162.2,?32.6,?20.0,?6.4,?3.3]
v2?=?[2.6,?5.9,?9.0,?26.4,?28.7,?70.7,?175.6,?182.2,?48.7,?18.8,?6.0,?2.3]
v3?=?[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()
bar.add("蒸發(fā)量",?attr,?v1)
bar.add("降水量",?attr,?v2,?yaxis_formatter="?ml",
????????yaxis_interval=50,?yaxis_max=250)
line?=?Line()
line.add("平均溫度",?attr,?v3,?yaxis_formatter="?°C",?yaxis_interval=5)
overlap?=?Overlap(width=800,?height=500)
#?默認不新增?x?y?軸,并且?x?y?軸的索引都為?0
overlap.add(bar)
#?新增一個?y?軸,此時?y?軸的數(shù)量為?2,第二個?y?軸的索引為?1(索引從?0?開始),所以設(shè)置?yaxis_index?=?1
#?由于使用的是同一個?x?軸,所以?x?軸部分不用做出改變
overlap.add(line,?yaxis_index=1,?is_add_yaxis=True)
overlap
??
3,Pages圖表組合
?
Pages可以將多張圖表按順序展示在一張網(wǎng)頁中,適合制作圖形化報表。Pages中的圖表可以是Grid,Overlap或Timeline.
?
?
from?pyecharts?import?Bar,?Scatter3Dfrom?pyecharts?import?Page
page?=?Page()?????????
#?bar
attr?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
v1?=?[5,?20,?36,?10,?75,?90]
v2?=?[10,?25,?8,?60,?20,?80]
bar?=?Bar("柱狀圖數(shù)據(jù)堆疊示例",width?=?500,height?=?300)
bar.add("商家A",?attr,?v1,?is_stack=True)
bar.add("商家B",?attr,?v2,?is_stack=True)
page.add(bar)?????????
#?scatter3D
import?random
data?=?[
????[random.randint(0,?100),
????random.randint(0,?100),
????random.randint(0,?100)]?for?_?in?range(80)
]
range_color?=?[
????'#313695',?'#4575b4',?'#74add1',?'#abd9e9',?'#e0f3f8',?'#ffffbf',
????'#fee090',?'#fdae61',?'#f46d43',?'#d73027',?'#a50026']
scatter3D?=?Scatter3D("3D?散點圖示例",?width=?500,?height=300)
scatter3D.add("",?data,?is_visualmap=True,?visual_range_color=range_color)
page.add(scatter3D)??
page
??
4,Timeline圖表組合
?
Timeline可以將多個圖表制作成動畫。
?
from?pyecharts?import?Bar,?Timelinefrom?random?import?randint
attr?=?["襯衫",?"羊毛衫",?"雪紡衫",?"褲子",?"高跟鞋",?"襪子"]
bar_1?=?Bar("2012?年銷量",?"數(shù)據(jù)純屬虛構(gòu)")
bar_1.add("春季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_1.add("夏季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_1.add("秋季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_1.add("冬季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_2?=?Bar("2013?年銷量",?"數(shù)據(jù)純屬虛構(gòu)")
bar_2.add("春季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_2.add("夏季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_2.add("秋季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_2.add("冬季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_3?=?Bar("2014?年銷量",?"數(shù)據(jù)純屬虛構(gòu)")
bar_3.add("春季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_3.add("夏季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_3.add("秋季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_3.add("冬季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_4?=?Bar("2015?年銷量",?"數(shù)據(jù)純屬虛構(gòu)")
bar_4.add("春季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_4.add("夏季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_4.add("秋季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_4.add("冬季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_5?=?Bar("2016?年銷量",?"數(shù)據(jù)純屬虛構(gòu)")
bar_5.add("春季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_5.add("夏季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_5.add("秋季",?attr,?[randint(10,?100)?for?_?in?range(6)])
bar_5.add("冬季",?attr,?[randint(10,?100)?for?_?in?range(6)],?is_legend_show=True)
timeline?=?Timeline(is_auto_play=True,
????????????????????timeline_bottom=0,
????????????????????timeline_play_interval=800??#?每800ms播放一張
???????????????????)
timeline.add(bar_1,?'2012?年')
timeline.add(bar_2,?'2013?年')
timeline.add(bar_3,?'2014?年')
timeline.add(bar_4,?'2015?年')
timeline.add(bar_5,?'2016?年')
timeline
?
轉(zhuǎn)載于:https://www.cnblogs.com/yinguo/p/11223265.html
總結(jié)
以上是生活随笔為你收集整理的Pyechart:30分钟学会pyecharts数据可视化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏大厅 从基础开始(6)--绕回来细说
- 下一篇: 欧拉回路判断规则