layout: post # 使用的布局(不需要改)title: Python可视化之matplotlib # 标题
subtitle: 利用matplotlib对数据进行可视化 #副标题
date: 2018-11-11 # 时间
author: NSX # 作者
header-img: img/post-bg-2015.jpg #这篇文章标题背景图片
catalog: true # 是否归档
tags: #标签
- 技术
- 教程

利用matplotlib对数据进行可视化

  • 简单曲线图
  • 复杂曲线图
  • 子图
  • 柱状图
  • 横向柱状图
  • 高级柱状图
  • 层次柱状图
  • 直方图
  • 饼图
  • 散点图
  • 雷达图

    导包

  1. import numpy as np
  2. import matplotlib
  3. import matplotlib.mlab as mlab
  4. import matplotlib.pyplot as plt
  5. import matplotlib.font_manager as fm

1、简单曲线图

  1. def simple_plot():
  2. """
  3. simple plot
  4. """
  5. # 生成测试数据
  6. x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
  7. y_cos, y_sin = np.cos(x), np.sin(x)
  8. # 生成画布,并设定标题
  9. plt.figure(figsize=(8, 6), dpi=80)
  10. plt.title("简单曲线图", fontproperties=myfont)
  11. plt.grid(True)
  12. # 设置X轴
  13. plt.xlabel("X轴", fontproperties=myfont)
  14. plt.xlim(-4.0, 4.0)
  15. plt.xticks(np.linspace(-4, 4, 9, endpoint=True))
  16. # 设置Y轴
  17. plt.ylabel("Y轴", fontproperties=myfont)
  18. plt.ylim(-1.0, 1.0)
  19. plt.yticks(np.linspace(-1, 1, 9, endpoint=True))
  20. # 画两条曲线
  21. plt.plot(x, y_cos, "b--", linewidth=2.0, label="cos示例")
  22. plt.plot(x, y_sin, "g-", linewidth=2.0, label="sin示例")
  23. # 设置图例位置,loc可以为[upper, lower, left, right, center]
  24. plt.legend(loc="upper left", prop=myfont, shadow=True)
  25. # 图形显示
  26. plt.show()
  27. return

2018-11-11-Python可视化之matplotlib - 图1

2、复杂曲线图

  1. def simple_advanced_plot():
  2. """
  3. simple advanced plot
  4. """
  5. # 生成测试数据
  6. x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
  7. y_cos, y_sin = np.cos(x), np.sin(x)
  8. # 生成画布, 并设定标题
  9. plt.figure(figsize=(8, 6), dpi=80)
  10. plt.title("复杂曲线图", fontproperties=myfont)
  11. plt.grid(True)
  12. # 画图的另外一种方式
  13. ax_1 = plt.subplot(111)
  14. ax_1.plot(x, y_cos, color="blue", linewidth=2.0, linestyle="--", label="左cos")
  15. ax_1.legend(loc="upper left", prop=myfont, shadow=True)
  16. # 设置Y轴(左边)
  17. ax_1.set_ylabel("左cos的y轴", fontproperties=myfont)
  18. ax_1.set_ylim(-1.0, 1.0)
  19. ax_1.set_yticks(np.linspace(-1, 1, 9, endpoint=True))
  20. # 画图的另外一种方式
  21. ax_2 = ax_1.twinx()
  22. ax_2.plot(x, y_sin, color="green", linewidth=2.0, linestyle="-", label="右sin")
  23. ax_2.legend(loc="upper right", prop=myfont, shadow=True)
  24. # 设置Y轴(右边)
  25. ax_2.set_ylabel("右sin的y轴", fontproperties=myfont)
  26. ax_2.set_ylim(-2.0, 2.0)
  27. ax_2.set_yticks(np.linspace(-2, 2, 9, endpoint=True))
  28. # 设置X轴(共同)
  29. ax_1.set_xlabel("x轴", fontproperties=myfont)
  30. ax_1.set_xlim(-4.0, 4.0)
  31. ax_1.set_xticks(np.linspace(-4, 4, 9, endpoint=True))
  32. # 图形显示
  33. plt.show()
  34. return

2018-11-11-Python可视化之matplotlib - 图2

3、子图

  1. def subplot_plot():
  2. """
  3. subplot plot
  4. """
  5. # 子图的style列表
  6. style_list = ["g+-", "r*-", "b.-", "yo-"]
  7. # 依次画图
  8. for num in range(4):
  9. # 生成测试数据
  10. x = np.linspace(0.0, 2+num, num=10*(num+1))
  11. y = np.sin((5-num) * np.pi * x)
  12. # 子图的生成方式
  13. plt.subplot(2, 2, num+1)
  14. plt.title("子图 %d" % (num+1), fontproperties=myfont)
  15. plt.plot(x, y, style_list[num])
  16. # 图形显示
  17. plt.show()
  18. return

2018-11-11-Python可视化之matplotlib - 图3

4、柱状图

  1. def bar_plot():
  2. """
  3. bar plot
  4. """
  5. # 生成测试数据
  6. means_men = (20, 35, 30, 35, 27)
  7. means_women = (25, 32, 34, 20, 25)
  8. # 设置标题
  9. plt.title("柱状图", fontproperties=myfont)
  10. # 设置相关参数
  11. index = np.arange(len(means_men))
  12. bar_width = 0.35
  13. # 画柱状图
  14. plt.bar(index, means_men, width=bar_width, alpha=0.2, color="b", label="男生")
  15. plt.bar(index+bar_width, means_women, width=bar_width, alpha=0.8, color="r", label="女生")
  16. plt.legend(loc="upper right", prop=myfont, shadow=True)
  17. # 设置柱状图标示
  18. for x, y in zip(index, means_men):
  19. plt.text(x, y+0.3, y, ha="center", va="bottom")
  20. for x, y in zip(index, means_women):
  21. plt.text(x+bar_width, y+0.3, y, ha="center", va="bottom")
  22. # 设置刻度范围/坐标轴名称等
  23. plt.ylim(0, 45)
  24. plt.xlabel("分组Group", fontproperties=myfont)
  25. plt.ylabel("得分Scores", fontproperties=myfont)
  26. plt.xticks(index+(bar_width/2), ("A组", "B组", "C组", "D组", "E组"), fontproperties=myfont)
  27. # 图形显示
  28. plt.show()
  29. return

2018-11-11-Python可视化之matplotlib - 图4

5、横向柱状图

  1. def barh_plot():
  2. """
  3. barh plot
  4. """
  5. # 生成测试数据
  6. means_men = (20, 35, 30, 35, 27)
  7. means_women = (25, 32, 34, 20, 25)
  8. # 设置标题
  9. plt.title("横向柱状图", fontproperties=myfont)
  10. # 设置相关参数
  11. index = np.arange(len(means_men))
  12. bar_height = 0.35
  13. # 画柱状图(水平方向)
  14. plt.barh(index, means_men, height=bar_height, alpha=0.2, color="b", label="Men")
  15. plt.barh(index+bar_height, means_women, height=bar_height, alpha=0.8, color="r", label="Women")
  16. plt.legend(loc="upper right", shadow=True)
  17. # 设置柱状图标示
  18. for x, y in zip(index, means_men):
  19. plt.text(y+0.3, x, y, ha="left", va="center")
  20. for x, y in zip(index, means_women):
  21. plt.text(y+0.3, x+bar_height, y, ha="left", va="center")
  22. # 设置刻度范围/坐标轴名称等
  23. plt.xlim(0, 45)
  24. plt.xlabel("Scores")
  25. plt.ylabel("Group")
  26. plt.yticks(index+(bar_height/2), ("A", "B", "C", "D", "E"))
  27. # 图形显示
  28. plt.show()
  29. return

2018-11-11-Python可视化之matplotlib - 图5

6、高级柱状图

  1. def bar_advanced_plot():
  2. """
  3. bar advanced plot
  4. """
  5. # 生成测试数据
  6. means_men = np.array((20, 35, 30, 35, 27, 25, 32, 34, 20, 25))
  7. means_women = np.array((25, 32, 34, 20, 25, 20, 35, 30, 35, 27))
  8. # 设置标题
  9. plt.title("高级柱状图", fontproperties=myfont)
  10. # 设置相关参数
  11. index = np.arange(len(means_men))
  12. bar_width = 0.8
  13. # 画柱状图(两种:X轴以上/X轴以下)
  14. plt.bar(index, means_men, width=bar_width, alpha=0.4, color="b", label="Men")
  15. plt.bar(index, -means_women, width=bar_width, alpha=0.4, color="r", label="Women")
  16. # 画折线图(两种,和柱状图对应)
  17. plt.plot(index, means_men, marker="o", linestyle="-", color="r", label="Men line")
  18. plt.plot(index, -means_women, marker=".", linestyle="--", color="b", label="Women line")
  19. # 设置图形标示(两种,和柱状图对应)
  20. for x, y in zip(index, means_men):
  21. plt.text(x, y+1, y, ha="center", va="bottom")
  22. for x, y in zip(index, means_women):
  23. plt.text(x, -y-1, y, ha="center", va="top")
  24. # 设置Y轴和图例位置
  25. plt.ylim(-45, 80)
  26. plt.legend(loc="upper left", shadow=True)
  27. # 图形显示
  28. plt.show()
  29. return

2018-11-11-Python可视化之matplotlib - 图6

7、层次柱状图

  1. def table_plot():
  2. """
  3. table plot
  4. """
  5. # 生成测试数据
  6. data = np.array([
  7. [1, 4, 2, 5, 2],
  8. [2, 1, 1, 3, 6],
  9. [5, 3, 6, 4, 1]
  10. ])
  11. # 设置标题
  12. plt.title("层次柱状图", fontproperties=myfont)
  13. # 设置相关参数
  14. index = np.arange(len(data[0]))
  15. color_index = ["r", "g", "b"]
  16. # 声明底部位置
  17. bottom = np.array([0, 0, 0, 0, 0])
  18. # 依次画图,并更新底部位置
  19. for i in range(len(data)):
  20. plt.bar(index, data[i], width=0.5, color=color_index[i], bottom=bottom, alpha=0.7, label="标签 %d" % i)
  21. bottom += data[i]
  22. # 设置图例位置
  23. plt.legend(loc="upper left", prop=myfont, shadow=True)
  24. # 图形显示
  25. plt.show()
  26. return

2018-11-11-Python可视化之matplotlib - 图7

8、直方图

  1. def histograms_plot():
  2. """
  3. histograms plot
  4. """
  5. # 生成测试数据
  6. mu, sigma = 100, 15
  7. x = mu + sigma * np.random.randn(10000)
  8. # 设置标题
  9. plt.title("直方图", fontproperties=myfont)
  10. # 画直方图, 并返回相关结果
  11. n, bins, patches = plt.hist(x, bins=50, normed=1, cumulative=False, color="green", alpha=0.6, label="直方图")
  12. # 根据直方图返回的结果, 画折线图
  13. y = mlab.normpdf(bins, mu, sigma)
  14. plt.plot(bins, y, "r--", label="线条")
  15. # 设置图例位置
  16. plt.legend(loc="upper left", prop=myfont, shadow=True)
  17. # 图形显示
  18. plt.show()
  19. return

2018-11-11-Python可视化之matplotlib - 图8

9、饼图

  1. def pie_plot():
  2. """
  3. pie plot
  4. """
  5. # 生成测试数据
  6. sizes = [15, 30, 45, 10]
  7. labels = ["Frogs", "中文", "Dogs", "Logs"]
  8. colors = ["yellowgreen", "gold", "lightskyblue", "lightcoral"]
  9. # 设置标题
  10. plt.title("饼图", fontproperties=myfont)
  11. # 设置突出参数
  12. explode = [0, 0.05, 0, 0]
  13. # 画饼状图
  14. patches, l_text, p_text = plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct="%1.1f%%", shadow=True, startangle=90)
  15. for text in l_text:
  16. text.set_fontproperties(myfont)
  17. plt.axis("equal")
  18. # 图形显示
  19. plt.show()
  20. return

2018-11-11-Python可视化之matplotlib - 图9

10、散点图

  1. def scatter_plot():
  2. """
  3. scatter plot
  4. """
  5. # 生成测试数据
  6. point_count = 1000
  7. x_index = np.random.random(point_count)
  8. y_index = np.random.random(point_count)
  9. # 设置标题
  10. plt.title("散点图", fontproperties=myfont)
  11. # 设置相关参数
  12. color_list = np.random.random(point_count)
  13. scale_list = np.random.random(point_count) * 100
  14. # 画散点图
  15. plt.scatter(x_index, y_index, s=scale_list, c=color_list, marker="o")
  16. # 图形显示
  17. plt.show()
  18. return

2018-11-11-Python可视化之matplotlib - 图10

11、雷达图

  1. def radar_plot():
  2. """
  3. radar plot
  4. """
  5. # 生成测试数据
  6. labels = np.array(["A组", "B组", "C组", "D组", "E组", "F组"])
  7. data = np.array([68, 83, 90, 77, 89, 73])
  8. theta = np.linspace(0, 2*np.pi, len(data), endpoint=False)
  9. # 数据预处理
  10. data = np.concatenate((data, [data[0]]))
  11. theta = np.concatenate((theta, [theta[0]]))
  12. # 画图方式
  13. plt.subplot(111, polar=True)
  14. plt.title("雷达图", fontproperties=myfont)
  15. # 设置"theta grid"/"radar grid"
  16. plt.thetagrids(theta*(180/np.pi), labels=labels, fontproperties=myfont)
  17. plt.rgrids(np.arange(20, 100, 20), labels=np.arange(20, 100, 20), angle=0)
  18. plt.ylim(0, 100)
  19. # 画雷达图,并填充雷达图内部区域
  20. plt.plot(theta, data, "bo-", linewidth=2)
  21. plt.fill(theta, data, color="red", alpha=0.25)
  22. # 图形显示
  23. plt.show()
  24. return

2018-11-11-Python可视化之matplotlib - 图11

数据可视化的库推荐

这里推荐几个比较常用的: