数据可视化对于数据分析的重要性不言而喻,一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib
实现绘图。能够提供各种各样的图表功能,包括:
- 单折线图
- 多折线图
- 柱状图
- 叠加柱状图
- 水平叠加柱状图
- 直方图
- 拆分直方图
- 箱型图
- 区域块图形
- 散点图
- 饼图
- 多子图
- 密度图
- 自由定制多子图
下面我们会依次讲解每一个图表的绘制,我们假设每一个代码文件里都引入了以下python
包:
#!/usr/bin/env python
# -*-coding: UTF-8 -*-import pandas as pd
import numpy as np
import MySQLdb
import randomimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
1. 单折线图
直接指定X轴、Y轴的值生成二维图表,np.arange
返回的类型是numpy.ndarray
。通过plt.title
能够指定图表标题,plt.xlabel
指定X轴名称,plt.ylable
指定Y轴名称。
示例
x = np.arange(1, 12)
print(type(x))y = x ** 2 + 4
print(type(y))plt.title("Matplotlib demo")
plt.xlabel("时间(分钟)")
plt.ylabel("金额($)")
plt.plot(x,y)
plt.show()
输出
2. 多折线图
示例
js = '''
{"index":["2020-09-01","2020-09-02","2020-09-03","2020-09-04"],"columns":["首页PV","搜索页PV","注册数","下单用户数","订单数"],"data":[[1, 2, 3, 4, 5],[3, 7, 8, null, 10],[5, null, 13, 14, 15],[7, null, 18, 19, 20]]
}
'''pv_conv = pd.read_json(js, orient='split')
pv_conv.plot()
plt.show()
输出
3. 柱状图
示例
data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.bar()plt.show()
数据
输出
4. 叠加柱状图
示例
data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.bar(stacked=True)plt.show()
数据
输出
5. 水平叠加柱状图
示例
data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.barh(stacked=True)plt.show()
数据
输出
6. 直方图
示例
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
print(df)
df.plot.hist(bins=20)
plt.show()
数据
输出
7. 拆分直方图
示例
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
print(df)df.hist(bins=20)plt.show()
数据
输出
8. 箱型图
用于展示每列中值的分布
示例
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
print(df)
df.plot.box()plt.show()
数据
输出
9. 区域块图形
示例
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.area()plt.show()
数据
输出
10. 散点图
参数说明
# x: 散点的x坐标位置
# y: 散点的y坐标位置
# s: 散点的大小
# c: 散点颜色
# 更多参数查看: help(df.plot.scatter)df.plot(kind='scatter', x='A', y='B', s=df.C*500, c='r')
plt.show()
示例
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.scatter(x='a', y='b')plt.show()
数据
输出
11. 饼图
示例
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
print(df)
df.plot.pie(subplots=True)plt.show()
数据
输出
12. 多子图
参数说明
- subplots: 默认False, 如果想要每列单独绘图,改为True
- layout: 画布划分多少块,(x,y)表示x行y列,块数要大于列数
- figsize: 整个画布大小
- sharey: 指定是否共享Y周范围
示例
df = pd.DataFrame(np.random.randn(4, 9), index=['a', 'b', 'c', 'd'], columns=np.arange(2, 11))
print(df)# df.plot(subplots=True, layout=(3, 3), figsize=(10, 10), kind='bar')
df.plot(subplots=True, layout=(3, 3), figsize=(10, 10), kind='bar', sharey=True)plt.show()
数据
输出
13. 密度图
类直方图,能够预测趋势
示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sys
import MySQLdb
import randomimport matplotlib.pyplot as plt
import scipyplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号pv_conv = {'首页PV': [985, 211, 688, 766],'搜索页PV': [290, 200, 201, 228],'注册数': [98, 21, 19, 71],'下单用户数': [46, 43, 68, 72],'订单数': [40, 50, 70, 80],
}df = pd.DataFrame(pv_conv)
print(df)df['首页PV'].plot.density()plt.show()
数据
输出
14. 自由定制多子图
示例
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltpd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['font.serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = Falsex = np.random.randn(100)
print(x)
fig, axes = plt.subplots(1, 4)
sns.kdeplot(x, ax=axes[0])
sns.kdeplot(x, ax=axes[1], cumulative=True) # 累积分布
sns.kdeplot(x, ax=axes[2], shade=True) # kde曲线下面的区域中进行阴影处理
sns.kdeplot(x, ax=axes[3], vertical=True) # X轴进行绘制还是以Y轴进行绘制
plt.show()
输出
参考资料
- https://zhuanlan.zhihu.com/p/33977558