1. 程式人生 > >【python學習筆記】45:認識Matplotlib和pyecharts資料視覺化

【python學習筆記】45:認識Matplotlib和pyecharts資料視覺化

學習《Python3爬蟲、資料清洗與視覺化實戰》時自己的一些實踐。


Matplotlib資料視覺化

資料準備

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("E:/Data/practice/taobao_data.csv")
# 求不同位置的產品的數值欄位(價格,成交量)的均值,然後按成交量降序
df_mean = df.groupby("位置").mean().sort_values("成交量", ascending=False)
# print(df_mean.head())

在這裡插入圖片描述

條形圖

# 設定繪圖風格
plt.style.use('ggplot')
# 繪製繪圖層
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))

# Series.plot()函式用Series中的項在mpl的座標系上進行繪圖,kind='barh'指定繪製的是橫向條形圖
df_mean['價格'].plot(kind='barh', ax=ax1)
# 設定橫向座標軸上的文字,在橫向條形圖中也就代表指標的意義
ax1.set_xlabel('各省份的平均價格')

# 繪製右邊的圖,各個省份平均的成交量
df_mean[
'成交量'].plot(kind='barh', ax=ax2) ax2.set_xlabel('各省份的平均成交量') # 自動調整和顯示 fig.tight_layout() plt.show()

在這裡插入圖片描述

折線圖/柱狀圖/箱型圖/餅圖

# 繪製各省份成交量的折線圖,柱狀圖,箱型圖,餅圖
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
s = df_mean['成交量']
s.plot(kind='line', ax=axes[0][0], title="折線圖")
s.plot(kind='bar', ax=axes[0][1], title='柱狀圖'
) s.plot(kind='box', ax=axes[1][0], title='箱型圖') s.plot(kind='pie', ax=axes[1][1], title='餅圖') fig.tight_layout() plt.show()

在這裡插入圖片描述

散點圖

# 繪製價格與成交量的散點圖
fig, ax = plt.subplots(1, 1, figsize=(12, 4))
# 傳入兩個等長的序列(這裡是Series)用來表示點的兩個維度座標
ax.scatter(df['價格'], df['成交量'])
ax.set_xlabel('價格')
ax.set_ylabel('成交量')
plt.show()

在這裡插入圖片描述

pyecharts資料視覺化

其實就是生成Echars圖表的一系列API。

pyecharts安裝

需要先安裝pyecharts_snapshot才能正常安裝pyecharts,使用pip安裝。pyecharts的官方文件很詳細,這裡就挑書上的一些比較有趣的嘗試一下。

餅圖

import json
from pyecharts import Pie

# 從json檔案中讀取衣服清洗劑資料至dict中
f = open("E:/Data/practice/pies.json")
data = json.load(f)

# 各類衣服清洗劑的名稱
name = data['name']
# 對應的銷售額
sales = data['sales']
# 對應的市場佔比
sales_volume = data['sales_volume']

# 初始化餅圖,設定標題,標題位置居左側
# width和height表示畫布的寬高,預設是800px和400px
pie = Pie("衣服或清洗劑市場佔比", title_pos='left', width=800)
# 新增一張圖,標題為"成交量"(這裡的標題在滑鼠放在圖上時顯示),center指定餅圖的圓心座標(預設用百分比,相對於較小邊的一半)
# radius指定[內半徑,外半徑],rosetype指定是否是南丁格爾圖(預設radius就是,還有area就圓心角相同)
pie.add("成交量", name, sales_volume, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')
# 這裡指定的rosetype='area'就不通過圓心角展示百分比,只通過半徑展示大小
# 這裡is_random=True指隨機排列顏色列表,is_legend_show=False不顯示頂端的圖例,is_label_show=True顯示圖形上的文字標籤
pie.add("銷售額", name, sales, center=[75, 50], is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False,
        is_label_show=True)
# pie.show_config() # 列印輸出圖表的所有配置項
pie.render("./rose.html")  # 生成本地的HTML檔案

在這裡插入圖片描述

漏斗圖

import json
from pyecharts import Funnel

f = open("E:/Data/practice/pies.json")
data = json.load(f)

name = data['name']
sales = data['sales']
sales_volume = data['sales_volume']

# 漏斗圖.這裡傳入空字串即可沒有titile
funnel = Funnel("", width=800)
# label_pos='inside'指明標籤的位置在圖的內部,label_text_color='#fff'指明標籤自己顏色為白色
funnel.add("成交量", name, sales_volume, is_label_show=True, label_pos='inside', label_text_color='#fff')
funnel.render("./funnel.html")

在這裡插入圖片描述

柱狀圖/條形圖

import json
from pyecharts import Bar
import copy

f = open("E:/Data/practice/pies.json")
data = json.load(f)

name = data['name']
sales = data['sales']
sales_volume = data['sales_volume']

'''
注,書上程式碼這裡作者為柱形圖設定了center,這是沒意義的
'''

# 柱形圖(普通)
bar = Bar("衣服清洗劑市場佔比", width=800)
# mark_point=['average']即在平均值位置做標記
bar.add("成交量", name, sales_volume, mark_point=['average'])
# mark_point=['max', 'min']即在最大值和最小值位置做標記
bar.add("銷售額", name, sales, mark_point=['max', 'min'])
bar.render('./bar.html')

# 條形圖
bar_hori = Bar("衣服清洗劑市場佔比", width=800)
bar_hori.add("銷售額", name, sales, mark_point=['max', 'min'])
# 相比普通柱形圖,只要在最後一次add裡設定is_convert=True即可
bar_hori.add("成交量", name, sales_volume, is_convert=True)
bar_hori.render('./bar_hori.html')

在這裡插入圖片描述
在這裡插入圖片描述

折線圖

import json
from pyecharts import Line

f = open("E:/Data/practice/lines.json")
data = json.load(f)
# 時間(月份)
date = data['date']
# 成交量
sale1 = data['sales1']
# 銷售額
sale2 = data['sales2']

# 折線圖(普通)
line1 = Line("洗衣液月售出情況")
# 設定標記點標記符號為菱形,設定標記點文字顏色#40ff27(暖綠)
line1.add("成交量", date, sale1, mark_point=['average', 'max', 'min'], mark_point_symbol='diamond',
          mark_point_textcolor='#40ff27')
# 設定折線為光滑曲線,設定標記線在最大值處和平均值處,設定標記符號為箭頭,設定標記符號大小
line1.add("銷售額", date, sale2, mark_point=['max'], is_smooth=True, mark_line=['max', 'average'],
          mark_point_symbol='arrow', mark_point_symbolsize=40)
line1.render("./line1.html")

在這裡插入圖片描述

# 折線圖(堆疊)
line2 = Line("洗衣液月售出情況")
# 設定is_stack=True即成為了堆疊的圖,即同樣設定堆疊的圖的值會堆高(而不是它原有的值)
# 在這個例子裡,成交量和銷售額完全是兩種不同的資料,堆疊其實意義不明
# 而且一般都是柱狀圖做堆疊,很少有用折線圖做堆疊的吧,作者這個例子不太好
line2.add("成交量", date, sale1, is_stack=True, is_label_show=True)
line2.add("銷售額", date, sale2, is_stack=True, is_label_show=True)
line2.render("./line2.html")

在這裡插入圖片描述

# 階梯折線
line3 = Line("洗衣液月售出情況")
# 設定is_step=True即可
line3.add("成交量", date, sale1, is_step=True, is_label_show=True)
line3.add("銷售額", date, sale2, is_step=True, is_label_show=True)
line3.render("./line3.html")

在這裡插入圖片描述

# 面積折線圖
line4 = Line("洗衣液月售出情況")
# 設定is_fill=True即可形成面積折線圖,area_opacity設定填充區域透明度
line4.add("成交量", date, sale1, is_fill=True, area_opacity=0.4)
line4.add("銷售額", date, sale2, is_fill=True, area_opacity=0.2)
line4.render("./line4.html")

在這裡插入圖片描述

儀表盤

from pyecharts import Gauge

# 儀表盤
gauge = Gauge("大標題")
# scale_range設定儀表盤資料範圍,angle_range設定角度範圍
gauge.add("儀表盤頂部的標題", "儀表盤上的標題", 80.2, scale_range=[0, 250], angle_range=[225, -45])
gauge.render("./gauge.html")

在這裡插入圖片描述

水球圖

from pyecharts import Liquid

liquid = Liquid("水球圖", title_pos='center')
# shape設定水球形狀,可以自定義svg,is_liquid_animation開啟動畫,is_liquid_outline_show顯示邊框
liquid.add("水球", [0.8, 0.3], shape='roundRect', is_liquid_animation=True, is_liquid_outline_show=True)
liquid.render("./liquid.html")

在這裡插入圖片描述

詞雲

from pyecharts import WordCloud
import pandas as pd

# 讀取記錄關鍵詞和詞頻的檔案
df_wd = pd.read_csv("E:/Data/practice/cp.csv", header=0)
# 生成關鍵詞列表和詞頻列表
words = [i[0] for i in df_wd[['關鍵詞']].values]
values = [i[0] for i in df_wd[['詞頻']].values]
# 詞雲
wc = WordCloud(width=1200, height=600)
# word_size_range設定詞的大小範圍,shape設定詞雲形狀
wc.add("", words, values, word_size_range=[10, 120], shape='pentagon')
wc.render("./wordcloud.html")

在這裡插入圖片描述

組合圖

from pyecharts import Bar, Line, Overlap
import json

f = open("E:/Data/practice/overlaps.json")
data = json.load(f)
date = data['date']
sales1 = data['sales1']
sales2 = data['sales2']

# 柱狀圖.在這個畫布上指定了大標題,可以讓其他畫布不再指定,最終就使用這個標題
bar = Bar("Line-Bar")
bar.add("柱狀", date, sales1, is_label_show=True)

# 折線圖
line = Line("")
line.add("折線", date, sales2, is_label_show=True)

# 合併
overlap = Overlap()
overlap.add(bar)
overlap.add(line)
overlap.render("./overlap.html")

在這裡插入圖片描述

3D柱形圖

from pyecharts import Bar3D
import json

f = open("E:/Data/practice/bar3ds.json")
datas = json.load(f)

# x軸類目資料
x_axis = datas['x_axis']
# y軸類目資料
y_axis = datas['y_axis']
# 要展示的資料,應是存[x,y,z]的列表,這裡似乎順序有點問題,作者在傳入時調整
data = datas['data']
# 顏色種類
range_color = datas['range_color']

# 3D柱形圖
bar3d = Bar3D("3D柱形圖", width=1200, height=600)
# grid3d_shading='realistic'渲染具有真實感的圖
# is_visualmap設定是否使用視覺對映元件,這個開了才能用後面的(子設定)
# visual_range_color設定過渡顏色,visual_range指定視覺對映元件的最小值和最大值
bar3d.add("", x_axis, y_axis, [[d[1], d[0], d[2]] for d in data], grid3d_shading='realistic',
          is_visualmap=True, visual_range_color=range_color, visual_range=[0, 20])
bar3d.render("./bar3d.html")

在這裡插入圖片描述