Matplotlib 和 Seaborn
1.Matplotlib
1.1 通过 figure()函数创建画布
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
data_one = np.arange(100, 201)
plt.plot(data_one) # 生成折线图
plt.show() # 显示
# 创建一个新的空白画布,返回Figure实例
figure_obj = plt.figure()
data_two = np.arange(200, 301)
plt.figure(facecolor='gray') # 画布背景为灰色
plt.plot(data_two) # 插入数据
plt.show()
1.2 通过 subplot()函数创建单个子图
nums = np.arange(0, 101) # (0, 100)
# 2*2的矩阵区域,占用编号为1的区域,及第一行第一列的子图
plt.subplot(221)
# 在选中的子图上作图
plt.plot(nums, nums)
# 2*2的矩阵区域,占用编号为2的区域,及第一行第二列的子图
plt.subplot(222)
plt.plot(nums, -nums)
# 2*1的矩阵区域,占用编号为2的区域,及第二行的子图
plt.subplot(212)
plt.plot(nums, nums**2)
plt.show()
1.3 通过 subplots()函数创建多个子图
nums = np.arange(1, 101)
# 分成2*2的矩阵区域,返回子图数组axes
# 创建多维窗口(2*2)
fig, 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()方法添加和选中子图
# 创建figure实例
fig = plt.figure()
# 添加子图
fig.add_subplot(2, 2, 1) # 2*2的1行1列
fig.add_subplot(2, 2, 2) # 2*2的1行2列
fig.add_subplot(2, 2, 4) # 2*2的2行2列
fig.add_subplot(2, 2, 3) # 2*2的2行1列
# 在子图上作图
random_arr = np.random.randn(100)
# 默认是在最后一次添加的子图位置上作图,即编号为3的编号
plt.plot(random_arr)
plt.show()
1.5 添加各类标签
data = 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([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这个函数。
plt.legend(["y=x^2", "y=x^3"]) # 添加图例
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 生成数组
x = np.linspace(-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)
plt.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)
plt.show()
# 设置y轴刻度
'''
设置对应坐标用汉字或英文表示,后面的属性fontproperties表示中文可见,不乱码,
内部英文$$表示将英文括起来,r表示正则匹配,通过这个方式将其变为好看的字体
如果要显示特殊字符,比如阿尔法,则用转意符\alpha,前面的\ 表示空格转意
'''
plt.yticks([-2, -1.8, -1, 1.22, 3.],
['非常糟糕', '糟糕', r'$good\ \alpha$', r'$really\ goods$', '超级好'],
fontproperties='SimHei',
fontsize = 12)
plt.show()
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)*10
# 绘制散点图
plt.scatter(x, y)
plt.show()
# 创建包含0~4的一维数组
x = np.arange(5)
# 从上下限范围内随机选取证书,创建两个2行5列的数组
y1, y2 = np.random.randint(1, 31, (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')
# 设置x轴的刻度
ax.set_xticks(x+width)
# 设置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个随机数值的数组
random_arr = np.random.randn(100)
plt.plot(random_arr)
plt.show()
2seaborn—绘制统计图形
2.1 可视化数据的分布
import seaborn as sns
%matplotlib inline
import numpy as np
# 显示调用set()获取默认绘图
sns.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 pd
dataframe_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")
# 加载sewaborn中的数据集
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.barplot(x="day", y="total_bill", data=tips)
sns.pointplot(x="day", y="total_bill", data=tips)