0 导语
Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 。
通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
Seaborn 是基于 Python 且非常受欢迎的图形可视化库,在 Matplotlib 的基础上,进行了更高级的封装,使得作图更加方便快捷。即便是没有什么基础的人,也能通过极简的代码,做出具有分析价值而又十分美观的图形。
在此之前,我已经写了一篇 Numpy 和 Pandas 的快速入门,本篇文章讲解数据可视化快速入门:
AI 基础:Numpy 简易入门
AI 基础:Pandas 简易入门
1.Matplotlib
1.1 通过 figure()函数创建画布
import matplotlib.pyplot as plt%matplotlib inline
import numpy as npdata_one = np.arange(100, 201) # 生成包含100~200的数组plt.plot(data_one) # 绘制data1折线图plt.show()
# 创建新的空白画布,返回Figure实例figure_obj = plt.figure()
data_two = np.arange(200, 301) # 生成包含200~300的数组plt.figure(facecolor=\'gray\') # 创建背景为灰色的新画布plt.plot(data_two) # 通过data2绘制折线图plt.show()
1.2 通过 subplot()函数创建单个子图
nums = np.arange(0, 101) # 生成0~100的数组# 分成2*2的矩阵区域,占用编号为1的区域,即第1行第1列的子图plt.subplot(221)# 在选中的子图上作图plt.plot(nums, nums)# 分成2*2的矩阵区域,占用编号为2的区域,即第1行第2列的子图plt.subplot(222)# 在选中的子图上作图plt.plot(nums, -nums)# 分成2*1的矩阵区域,占用编号为2的区域,即第2行的子图plt.subplot(212)# 在选中的子图上作图plt.plot(nums, nums**2)# 在本机上显示图形plt.show()
1.3 通过 subplots()函数创建多个子图
# 生成包含1~100之间所有整数的数组nums = np.arange(1, 101)# 分成2*2的矩阵区域,返回子图数组axesfig, axes = plt.subplots(2, 2)ax1 = axes[0, 0] # 根据索引[0,0]从Axes对象数组中获取第1个子图ax2 = axes[0, 1] # 根据索引[0,1]从Axes对象数组中获取第2个子图ax3 = axes[1, 0] # 根据索引[1,0]从Axes对象数组中获取第3个子图ax4 = axes[1, 1] # 根据索引[1,1]从Axes对象数组中获取第4个子图# 在选中的子图上作图ax1.plot(nums, nums)ax2.plot(nums, -nums)ax3.plot(nums, nums**2)ax4.plot(nums, np.log(nums))plt.show()
1.4 通过 add_subplot()方法添加和选中子图
# 引入matplotlib包import matplotlib.pyplot as pltimport numpy as np# 创建Figure实例fig = plt.figure()# 添加子图fig.add_subplot(2, 2, 1)fig.add_subplot(2, 2, 2)fig.add_subplot(2, 2, 4)fig.add_subplot(2, 2, 3)# 在子图上作图random_arr = np.random.randn(100)# 默认是在最后一次使用subplot的位置上作图,即编号为3的位置plt.plot(random_arr)plt.show()
1.5 添加各类标签
import numpy as npdata = np.arange(0, 1.1, 0.01)plt.title(\"Title\") # 添加标题plt.xlabel(\"x\") # 添加x轴的名称plt.ylabel(\"y\") # 添加y轴的名称# 设置x和y轴的刻度plt.xticks([0, 0.5, 1])plt.yticks([0, 0.5, 1.0])plt.plot(data, data**2) # 绘制y=x^2曲线plt.plot(data, data**3) # 绘制y=x^3曲线plt.legend([\"y=x^2\", \"y=x^3\"]) # 添加图例plt.show() # 在本机上显示图形
import numpy as npx=np.linspace(-3,3,50)#产生-3到3之间50个点y1=2*x+1#定义函数y2=x**2
# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小plt.figure(num=3, figsize=(8, 5))plt.plot(x, y2)# 红色虚线直线宽度默认1.0plt.plot(x, y1, color=\'red\', linewidth=1.0, linestyle=\'--\')plt.xlim((-1, 2)) #设置x轴范围plt.ylim((-2, 3)) #设置轴y范围#设置坐标轴含义, 注:英文直接写,中文需要后面加上fontproperties属性plt.xlabel(u\'价格\', fontproperties=\'SimHei\', fontsize=16)plt.ylabel(u\'利润\', fontproperties=\'SimHei\', fontsize=16)# 设置x轴刻度# -1到2区间,5个点,4个区间,平均分:[-1.,-0.25,0.5,1.25,2.]new_ticks = np.linspace(-1, 2, 5)print(new_ticks)plt.xticks(new_ticks)# 设置y轴刻度\'\'\'设置对应坐标用汉字或英文表示,后面的属性fontproperties表示中文可见,不乱码,内部英文$$表示将英文括起来,r表示正则匹配,通过这个方式将其变为好看的字体如果要显示特殊字符,比如阿尔法,则用转意符\\alpha,前面的\\ 表示空格转意\'\'\'plt.yticks([-2, -1.8, -1, 1.22, 3.],[\'非常糟糕\', \'糟糕\', r\'$good\\ \\alpha$\', r\'$really\\ good$\', \'超级好\'],fontproperties=\'SimHei\',fontsize=12)plt.show()
[-1. -0.25 0.5 1.25 2. ]
1.6 绘制常见类型图表
arr_random = np.random.randn(100) # 创建随机数组plt.hist(arr_random, bins=8, color=\'g\', alpha=0.7) # 绘制直方图plt.show() # 显示图形
# 创建包含整数0~50的数组,用于表示x轴的数据x = np.arange(51)# 创建另一数组,用于表示y轴的数据y = np.random.rand(51) * 10plt.scatter(x, y) # 绘制散点图plt.show()
# 创建包含0~4的一维数组x = np.arange(5)# 从上下限范围内随机选取整数,创建两个2行5列的数组y1, y2 = np.random.randint(1, 31, 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) # 设置x轴的刻度# 设置x轴的刻度标签ax.set_xticklabels([\'January\', \'February\', \'March\', \'April \', \'May \'])plt.show() # 显示图形
data = np.arange(1, 3, 0.3)# 绘制直线,颜色为青色,标记为“x”,线型为长虚线plt.plot(data, color=\"c\", marker=\"x\", linestyle=\"--\")# 绘制直线,颜色为品红,标记为实心圆圈,线型为短虚线plt.plot(data+1, color=\"m\", marker=\"o\", linestyle=\":\")# 绘制直线,颜色为黑色,标记为五边形,线型为短点相间线plt.plot(data+2, color=\"k\", marker=\"p\", linestyle=\"-.\")# 也可采用下面的方式绘制三条不同颜色、标记和线型的直线# plt.plot(data, \'cx--\', data+1, \'mo:\', data+2, \'kp-.\')plt.show()
1.7 本地保存图形
# 创建包含100个数值的随机数组import numpy as nprandom_arr = np.random.randn(100)
random_arr
array([-2.02009735, -1.21035005, 0.57679581, -0.00584516, 0.59612158,-0.31118333, -0.67245832, -0.56589637, 0.25570972, 0.68256563,-0.45816656, 0.34956566, 0.51020863, -0.75272333, 1.42433863,-0.05658573, 0.35273745, -0.35519388, 0.15499307, 0.39895018,-1.86154032, -1.23949979, -0.63471999, 1.09811855, 0.02552633,-0.16804823, 0.34956809, 0.93485716, 0.37747537, -0.16523647,-1.04335227, -0.01702448, 1.60924259, 1.15294223, -0.15174045,-0.03772519, 1.090792 , 0.65279282, 0.38186503, -1.3393988 ,0.10098444, -0.67411024, -2.39433996, -0.43594683, -0.155494 ,0.54676898, -0.97705035, -1.34799225, 1.64568965, -1.30594202,-0.30704745, -0.61612604, 1.09322798, 0.88921527, -0.22512233,-1.10477607, -0.61717627, 0.73952416, 0.30252205, 0.60808863,-0.3400892 , -2.01174842, -0.46480751, 1.54980369, 1.74610516,-0.53146867, -0.70904096, 1.73856111, -0.09254733, 0.43490467,-0.87201768, -0.73685075, -0.65868507, -0.18305015, 0.62559549,0.30743734, -0.78680136, -0.05808801, -0.23935035, -1.14580197,0.99154585, 0.07974613, 0.61315198, 0.93667393, 0.76542518,1.90500996, 0.0306359 , -2.53801425, 0.17371482, 1.75721226,0.25076371, -1.00032227, 0.20617839, 0.81751139, 0.64920089,1.3145223 , 1.05360644, 2.06404062, 1.7208791 , -0.09375516])
# 将随机数组的数据绘制线形图plt.plot(random_arr)plt.show()
2 seaborn—绘制统计图形
2.1 可视化数据的分布
import seaborn as sns%matplotlib inlineimport numpy as npsns.set() # 显式调用set()获取默认绘图np.random.seed(0) # 确定随机数生成器的种子arr = np.random.randn(100) # 生成随机数组ax = sns.distplot(arr, bins=10) # 绘制直方图
# 创建包含500个位于[0,100]之间整数的随机数组array_random = np.random.randint(0, 100, 500)# 绘制核密度估计曲线sns.distplot(array_random, hist=False, rug=True)
# 创建DataFrame对象import pandas as pddataframe_obj = pd.DataFrame({\"x\": np.random.randn(500),\"y\": np.random.randn(500)})dataframe_obj
x | y | |
---|---|---|
0 | 0.478215 | 1.246931 |
1 | -0.053906 | 0.187860 |
2 | -1.241901 | 1.281412 |
3 | -1.658495 | 1.375265 |
4 | -0.353372 | 1.420608 |
5 | 1.656508 | -0.557275 |
6 | 1.511913 | 1.657975 |
7 | -0.906804 | 0.452821 |
8 | -0.777217 | -0.368433 |
9 | -0.739228 | -1.286740 |
10 | 0.987989 | -1.634521 |
11 | -0.026473 | -0.010277 |
12 | -1.262669 | -0.256035 |
13 | -1.561165 | 0.918040 |
14 | -0.939354 | -0.127256 |
15 | 0.335453 | 0.217671 |
16 | -1.489752 | 0.432434 |
17 | -1.066911 | -0.515731 |
18 | 1.035863 | -0.297603 |
19 | 0.631313 | -0.653702 |
20 | -1.894367 | 1.868757 |
21 | 0.036571 | 0.237410 |
22 | -0.312502 | -1.319956 |
23 | 0.814248 | -0.811489 |
24 | 0.382404 | -0.449499 |
25 | 1.646666 | 0.410724 |
26 | 0.227553 | 0.313078 |
27 | -1.399875 | 0.431041 |
28 | -2.161313 | -1.314429 |
29 | 0.280750 | 2.321291 |
… | … | … |
470 | -1.266559 | -0.595866 |
471 | -0.766566 | 0.096873 |
472 | 0.205730 | -1.270893 |
473 | -0.608373 | -1.875642 |
474 | -0.323170 | 0.336776 |
475 | -1.615268 | -1.565554 |
476 | 0.433679 | 1.887319 |
477 | -0.217975 | -0.728759 |
478 | 1.023324 | 0.201026 |
479 | -0.134135 | -0.746496 |
480 | 0.046724 | 1.299394 |
481 | -0.595088 | -0.641203 |
482 | -1.949716 | -0.520380 |
483 | -0.530026 | -0.348830 |
484 | -1.060356 | -0.013075 |
485 | -0.908488 | -0.981377 |
486 | -0.034975 | -1.450624 |
487 | -1.426397 | 0.320157 |
488 | -1.302537 | 1.746811 |
489 | -1.190758 | 0.407325 |
490 | -0.170543 | 0.311181 |
491 | 0.814052 | 0.299761 |
492 | -0.520146 | 0.591630 |
493 | 1.934602 | -0.165131 |
494 | -0.052196 | -0.524848 |
495 | -1.057486 | 0.939177 |
496 | -0.158090 | -1.588747 |
497 | -0.238412 | 1.627092 |
498 | 0.279500 | -0.218554 |
499 | 1.962078 | -0.956771 |
500 rows × 2 columns
# 绘制散布图sns.jointplot(x=\"x\", y=\"y\", data=dataframe_obj)
# 绘制二维直方图sns.jointplot(x=\"x\", y=\"y\", data=dataframe_obj, kind=\"hex\")
# 核密度估计sns.jointplot(x=\"x\", y=\"y\", data=dataframe_obj, kind=\"kde\")
# 加载seaborn中的数据集dataset = sns.load_dataset(\"tips\")# 绘制多个成对的双变量分布sns.pairplot(dataset)
2.2 用分类数据绘图
tips = sns.load_dataset(\"tips\")sns.stripplot(x=\"day\", y=\"total_bill\", data=tips)
tips = sns.load_dataset(\"tips\")sns.stripplot(x=\"day\", y=\"total_bill\", data=tips, jitter=True)
sns.swarmplot(x=\"day\", y=\"total_bill\", data=tips)
sns.boxplot(x=\"day\", y=\"total_bill\", data=tips)
sns.violinplot(x=\"day\", y=\"total_bill\", data=tips)
sns.barplot(x=\"day\", y=\"total_bill\", data=tips)
sns.pointplot(x=\"day\", y=\"total_bill\", data=tips)