01.Matplotlib绘图
    04.数据可视化工具 - 图1
    Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
    http://matplotlib.org
    用于创建出版质量图表的绘图工具库
    目的是为Python构建一个Matlab式的绘图接口
    import matplotlib.pyplot as plt
    pyploy模块包含了常用的matplotlib API函数
    04.数据可视化工具 - 图2
    figure
    Matplotlib的图像均位于figure对象中
    创建figure:fig = plt.figure()
    示例代码:
    # 引入matplotlib包import matplotlib.pyplot as pltimport numpy as np %matplotlib inline #在jupyter notebook 里需要使用这一句命令# 创建figure对象fig = plt.figure()
    运行结果:

    subplot
    fig.add_subplot(a, b, c)
    a,b 表示将fig分割成 ab 的区域
    c 表示当前选中要操作的区域,
    注意:从1开始编号(不是从0开始)
    plot 绘图的区域是最后一次指定subplot的位置 (jupyter notebook里不能正确显示)
    示例代码:
    # 指定切分区域的位置ax1 = fig.add_subplot(2,2,1) ax2 = fig.add_subplot(2,2,2) ax3 = fig.add_subplot(2,2,3) ax4 = fig.add_subplot(2,2,4) # 在subplot上作图random_arr = np.random.randn(100)#print random_arr# 默认是在最后一次使用subplot的位置上作图,但是在jupyter notebook 里可能显示有误plt.plot(random_arr) # 可以指定在某个或多个subplot位置上作图# ax1 = fig.plot(random_arr)# ax2 = fig.plot(random_arr)# ax3 = fig.plot(random_arr)# 显示绘图结果plt.show()
    运行结果:
    04.数据可视化工具 - 图3
    直方图:hist
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np plt.hist(np.random.randn(100), bins=10, color=’b’, alpha=0.3) plt.show()
    运行结果:
    04.数据可视化工具 - 图4
    散点图:scatter
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np # 绘制散点图x = np.arange(50) y = x + 5
    np.random.rand(50) plt.scatter(x, y) plt.show()
    运行结果:
    04.数据可视化工具 - 图5

    柱状图:bar
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np # 柱状图x = np.arange(5) y1, y2 = np.random.randint(1, 25, size=(2, 5)) width = 0.25

    ax = plt.subplot(1,1,1) ax.bar(x, y1, width, color=’r’) ax.bar(x+width, y2, width, color=’g’) ax.set_xticks(x+width) ax.set_xticklabels([‘a’, ‘b’, ‘c’, ‘d’, ‘e’]) plt.show()
    运行结果:
    04.数据可视化工具 - 图6
    矩阵绘图:plt.imshow()
    混淆矩阵,三个维度的关系
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np # 矩阵绘图m = np.random.rand(10,10) print(m) plt.imshow(m, interpolation=’nearest’, cmap=plt.cm.ocean) plt.colorbar() plt.show()
    运行结果:
    [[ 0.92859942 0.84162134 0.37814667 0.46401549 0.93935737 0.0344159 0.56358375 0.75977745 0.87983192 0.22818774] [ 0.88216959 0.43369207 0.1303902 0.98446182 0.59474031 0.04414217 0.86534444 0.34919228 0.53950028 0.89165269] [ 0.52919761 0.87408715 0.097871 0.78348534 0.09354791 0.3186 0.25978432 0.48340623 0.1107699 0.14065592] [ 0.90834516 0.42377475 0.73042695 0.51596826 0.14154431 0.22165693 0.64705882 0.78062873 0.55036304 0.40874584] [ 0.98853697 0.46762114 0.69973423 0.7910757 0.63700306 0.68793919 0.28685306 0.3473426 0.17011744 0.18812329] [ 0.73688943 0.58004874 0.03146167 0.08875797 0.32930191 0.87314734 0.50757536 0.8667078 0.8423364 0.99079049] [ 0.37660356 0.63667774 0.78111565 0.25598593 0.38437628 0.95771051 0.01922366 0.37020219 0.51020305 0.05365718] [ 0.87588452 0.56494761 0.67320078 0.46870376 0.66139913 0.55072149 0.51328222 0.64817353 0.198525 0.18105368] [ 0.86038137 0.55914088 0.55240021 0.15260395 0.4681218 0.28863395 0.6614597 0.69015592 0.46583629 0.15086562] [ 0.01373772 0.30514083 0.69804049 0.5014782 0.56855904 0.14889117 0.87596848 0.29757133 0.76062891 0.03678431]]
    04.数据可视化工具 - 图7
    plt.subplots()
    同时返回新创建的figure和subplot对象数组
    生成2行2列subplot:fig, subplot_arr = plt.subplots(2,2)
    在jupyter里可以正常显示,推荐使用这种方式创建多个图表
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np fig, subplot_arr = plt.subplots(2,2)# bins 为显示个数,一般小于等于数值个数subplot_arr[1,0].hist(np.random.randn(100), bins=10, color=’b’, alpha=0.3) plt.show()
    运行结果:
    04.数据可视化工具 - 图8
    颜色、标记、线型
    ax.plot(x, y, ‘r—’)
    等价于ax.plot(x, y, linestyle=‘—’, color=‘r’)
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np fig, axes = plt.subplots(2) axes[0].plot(np.random.randint(0, 100, 50), ‘ro—‘)# 等价axes[1].plot(np.random.randint(0, 100, 50), color=’r’, linestyle=’dashed’, marker=’o’)
    运行结果:
    []
    04.数据可视化工具 - 图9
    常用的颜色、标记、线型
    04.数据可视化工具 - 图10

    04.数据可视化工具 - 图11

    04.数据可视化工具 - 图12

    刻度、标签、图例
    设置刻度范围
    plt.xlim(), plt.ylim()
    ax.set_xlim(), ax.set_ylim()
    设置显示的刻度
    plt.xticks(), plt.yticks()
    ax.set_xticks(), ax.set_yticks()
    设置刻度标签
    ax.set_xticklabels(), ax.set_yticklabels()
    设置坐标轴标签
    ax.set_xlabel(), ax.set_ylabel()
    设置标题
    ax.set_title()
    图例
    ax.plot(label=‘legend’)
    ax.legend(), plt.legend()
    loc=‘best’:自动选择放置图例最佳位置
    示例代码:
    import matplotlib.pyplot as pltimport numpy as np fig, ax = plt.subplots(1) ax.plot(np.random.randn(1000).cumsum(), label=’line0’) # 设置刻度#plt.xlim([0,500])ax.set_xlim([0, 800]) # 设置显示的刻度#plt.xticks([0,500])ax.set_xticks(range(0,500,100)) # 设置刻度标签ax.set_yticklabels([‘Jan’, ‘Feb’, ‘Mar’]) # 设置坐标轴标签ax.set_xlabel(‘Number’) ax.set_ylabel(‘Month’) # 设置标题ax.set_title(‘Example’) # 图例ax.plot(np.random.randn(1000).cumsum(), label=’line1’) ax.plot(np.random.randn(1000).cumsum(), label=’line2’) ax.legend() ax.legend(loc=’best’)#plt.legend()
    运行结果:
    04.数据可视化工具 - 图13

    02.seaborn绘图
    04.数据可视化工具 - 图14
    http://seaborn.pydata.org/index.html
    Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
    Python中的一个制图工具库,可以制作出吸引人的、信息量大的统计图
    在Matplotlib上构建,支持numpy和pandas的数据结构可视化。
    多个内置主题及颜色主题
    可视化单一变量、二维变量用于比较数据集中各变量的分布情况
    可视化线性回归模型中的独立变量及不独立变量
    import numpy as npimport pandas as pd# from scipy import statsimport matplotlib.pyplot as pltimport seaborn as sns# %matplotlib inline
    数据集分布可视化
    单变量分布 sns.distplot()
    示例代码:
    # 单变量分布x1 = np.random.normal(size=1000) sns.distplot(x1); x2 = np.random.randint(0, 100, 500) sns.distplot(x2);
    运行结果:
    04.数据可视化工具 - 图15

    04.数据可视化工具 - 图16

    直方图 sns.distplot(kde=False)
    示例代码:
    # 直方图sns.distplot(x1, bins=20, kde=False, rug=True)
    运行结果:
    04.数据可视化工具 - 图17
    核密度估计 sns.distplot(hist=False) 或 sns.kdeplot()
    示例代码:
    # 核密度估计sns.distplot(x2, hist=False, rug=True)
    运行结果:
    04.数据可视化工具 - 图18
    双变量分布
    示例代码:
    # 双变量分布df_obj1 = pd.DataFrame({“x”: np.random.randn(500), “y”: np.random.randn(500)}) df_obj2 = pd.DataFrame({“x”: np.random.randn(500), “y”: np.random.randint(0, 100, 500)})
    散布图 sns.jointplot()
    示例代码:
    # 散布图sns.jointplot(x=”x”, y=”y”, data=df_obj1)
    运行结果:
    04.数据可视化工具 - 图19
    二维直方图 Hexbin sns.jointplot(kind=‘hex’)
    示例代码:
    # 二维直方图sns.jointplot(x=”x”, y=”y”, data=df_obj1, kind=”hex”);
    运行结果:
    04.数据可视化工具 - 图20
    核密度估计 sns.jointplot(kind=‘kde’)
    示例代码:
    # 核密度估计sns.jointplot(x=”x”, y=”y”, data=df_obj1, kind=”kde”);
    运行结果:
    04.数据可视化工具 - 图21
    数据集中变量间关系可视化 sns.pairplot()
    示例代码:
    # 数据集中变量间关系可视化dataset = sns.load_dataset(“tips”)#dataset = sns.load_dataset(“iris”)sns.pairplot(dataset);
    运行结果:
    04.数据可视化工具 - 图22
    类别数据可视化
    #titanic = sns.load_dataset(‘titanic’)#planets = sns.load_dataset(‘planets’)#flights = sns.load_dataset(‘flights’)#iris = sns.load_dataset(‘iris’)exercise = sns.load_dataset(‘exercise’)
    类别散布图
    sns.stripplot() 数据点会重叠
    示例代码:
    sns.stripplot(x=”diet”, y=”pulse”, data=exercise)
    运行结果:
    04.数据可视化工具 - 图23
    sns.swarmplot() 数据点避免重叠,hue指定子类别
    示例代码:
    sns.swarmplot(x=”diet”, y=”pulse”, data=exercise, hue=’kind’)
    运行结果:
    04.数据可视化工具 - 图24
    类别内数据分布
    盒子图 sns.boxplot(), hue指定子类别
    示例代码:
    # 盒子图sns.boxplot(x=”diet”, y=”pulse”, data=exercise)#sns.boxplot(x=”diet”, y=”pulse”, data=exercise, hue=’kind’)
    运行结果:
    04.数据可视化工具 - 图25
    小提琴图 sns.violinplot(), hue指定子类别
    示例代码:
    # 小提琴图#sns.violinplot(x=”diet”, y=”pulse”, data=exercise)sns.violinplot(x=”diet”, y=”pulse”, data=exercise, hue=’kind’)
    运行结果:
    04.数据可视化工具 - 图26
    类别内统计图
    柱状图 sns.barplot()
    示例代码:
    # 柱状图sns.barplot(x=”diet”, y=”pulse”, data=exercise, hue=’kind’)
    运行结果:
    04.数据可视化工具 - 图27
    点图 sns.pointplot()
    示例代码:
    # 点图sns.pointplot(x=”diet”, y=”pulse”, data=exercise, hue=’kind’);
    运行结果:
    04.数据可视化工具 - 图28

    03.**Bokeh绘图
    04.数据可视化工具 - 图29
    http://bokeh.pydata.org/en/latest
    Bokeh
    是一个专门针对Web浏览器的呈现功能的交互式可视化Python库。这是Bokeh与其它可视化库最核心的区别。
    专门针对Web浏览器的交互式、可视化Python绘图库
    可以做出像D3.js简洁漂亮的交互可视化效果,但是使用难度低于D3.js。
    独立的HTML文档或服务端程序
    可以处理大量、动态或数据流
    支持Python (或Scala, R, Julia…)
    不需要使用Javascript
    Bokeh接口
    Charts: 高层接口,以简单的方式绘制复杂的统计图
    Plotting: 中层接口,用于组装图形元素
    Models: 底层接口,为开发者提供了最大的灵活性
    04.数据可视化工具 - 图30
    包引用
    from bokeh.io import output_notebook, output_file, showfrom bokeh.charts import Scatter, Bar, BoxPlot, Chordfrom bokeh.layouts import rowimport seaborn as sns # 导入数据exercise = sns.load_dataset(‘exercise’) output_notebook()#output_file(‘test.html’)
    from bokeh.io import output_file 生成.html文档
    from boken.io import output_notebook 在jupyter中使用
    bokeh.charts
    http://bokeh.pydata.org/en/latest/docs/reference/charts.html
    散点图 Scatter
    示例代码:
    # 散点图p = Scatter(data=exercise, x=’id’, y=’pulse’, title=’exercise dataset’) show(p)
    运行结果:
    04.数据可视化工具 - 图31
    柱状图 Bar
    示例代码:
    # 柱状图p = Bar(data=exercise, values=’pulse’, label=’diet’, stack=’kind’, title=’exercise dataset’) show(p)
    运行结果:
    04.数据可视化工具 - 图32
    盒子图 BoxPlot**
    示例代码:
    # 盒子图box1 = BoxPlot(data=exercise, values=’pulse’, label=’diet’, color=’diet’, title=’exercise dataset’) box2 = BoxPlot(data=exercise, values=’pulse’, label=’diet’, stack=’kind’, color=’kind’, title=’exercise dataset’) show(row(box1, box2))
    运行结果:
    04.数据可视化工具 - 图33

    04.数据可视化工具 - 图34

    弦图 Chord
    • 展示多个节点之间的联系
    • 连线的粗细代表权重
    示例代码:
    # 弦图 Chordchord1 = Chord(data=exercise, source=”id”, target=”kind”) chord2 = Chord(data=exercise, source=”id”, target=”kind”, value=”pulse”) show(row(chord1, chord2))
    运行结果:
    04.数据可视化工具 - 图35

    04.数据可视化工具 - 图36

    bokeh.plotting
    方框 square, 圆形 circle
    示例代码:
    from bokeh.plotting import figureimport numpy as np p = figure(plot_width=400, plot_height=400)# 方框p.square(np.random.randint(1,10,5), np.random.randint(1,10,5), size=20, color=”navy”) # 圆形p.circle(np.random.randint(1,10,5), np.random.randint(1,10,5), size=10, color=”green”) show(p)
    运行结果:
    04.数据可视化工具 - 图37
    更多图形元素参考:http://bokeh.pydata.org/en/latest/docs/reference/plotting.html

    04.世界高峰数据可视化 (World’s Highest Mountains)
    参考:https://www.kaggle.com/alex64/d/abcsds/highest-mountains/let-s-climb
    import pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import style style.use(‘ggplot’) # 设置图片显示的主题样式# 解决matplotlib显示中文问题plt.rcParams[‘font.sans-serif’] = [‘SimHei’] # 指定默认字体plt.rcParams[‘axes.unicodeminus’] = False # 解决保存图像是负号’-‘显示为方块的问题 datasetpath = ‘./dataset/Mountains.csv’ def previewdata(data): “”” 数据预览 “”” # 数据预览 print(data.head()) # 数据信息 print(data.info()) def procsuccess(val): “”” 处理 ‘Ascents bef. 2004’ 列中的数据 “”” if ‘>’ in str(val): return 200 elif ‘Many’ in str(val): return 160 else: return val def run_main(): “”” 主函数 “”” data = pd.read_csv(dataset_path) preview_data(data) # 数据重构 # 重命名列名 data.rename(columns={‘Height (m)’: ‘Height’, ‘Ascents bef. 2004’: ‘Success’, ‘Failed attempts bef. 2004’: ‘Failed’}, inplace=True) # 数据清洗 data[‘Failed’] = data[‘Failed’].fillna(0).astype(int) data[‘Success’] = data[‘Success’].apply(proc_success) data[‘Success’] = data[‘Success’].fillna(0).astype(int) data = data[data[‘First ascent’] != ‘unclimbed’] data[‘First ascent’] = data[‘First ascent’].astype(int) # 可视化数据 # 1. 登顶次数 vs 年份 plt.hist(data[‘First ascent’].astype(int), bins=20) plt.ylabel(‘高峰数量’) plt.xlabel(‘年份’) plt.title(‘登顶次数’) plt.savefig(‘./first_ascent_vs_year.png’) plt.show() # 2. 高峰vs海拔 data[‘Height’].plot.hist(color=’steelblue’, bins=20) plt.bar(data[‘Height’], (data[‘Height’] - data[‘Height’].min()) / (data[‘Height’].max() - data[‘Height’].min()) * 23, # 按比例缩放 color=’red’, width=30, alpha=0.2) plt.ylabel(‘高峰数量’) plt.xlabel(‘海拔’) plt.text(8750, 20, “海拔”, color=’red’) plt.title(‘高峰vs海拔’) plt.savefig(‘./mountain_vs_height.png’) plt.show() # 3. 首次登顶 data[‘Attempts’] = data[‘Failed’] + data[‘Success’] # 攀登尝试次数 fig = plt.figure(figsize=(13, 7)) fig.add_subplot(211) plt.scatter(data[‘First ascent’], data[‘Height’], c=data[‘Attempts’], alpha=0.8, s=50) plt.ylabel(‘海拔’) plt.xlabel(‘登顶’) fig.add_subplot(212) plt.scatter(data[‘First ascent’], data[‘Rank’].max() - data[‘Rank’], c=data[‘Attempts’], alpha=0.8, s=50) plt.ylabel(‘排名’) plt.xlabel(‘登顶’) plt.savefig(‘./mountain_vs_attempts.png’) plt.show() # 课后练习,尝试使用seaborn或者bokeh重现上述显示的结果if __name == ‘__main‘: run_main()