【数据操作与可视化】Matplotlib绘图-生成其他图表类型
1、散点图
散点图跟折线图的区别是,折线图会将各个不同的坐标点连接起来绘制图形,这样我们就看不出来原来的坐标点是哪些了。而散点图会直接根据原来的坐标点来进行图形的绘制,可以从图上直接看出坐标点的位置,非常方便我们观测数据的分布和形状。
python
x = np.linspace(0, 10, 100) # 0到10之间的所有数据,分成100个组
y = np.sin(x)
# 绘图设置
plt.figure(figsize=(8, 4), dpi=100) # 宽度和高度(英寸),dpi,每英寸像素值
plt.title('正余弦信号', color='red', fontsize=20, rotation=0, alpha=1) # 添加标题,rotation角度旋转,alpha透明度
plt.xlabel('时间', fontsize=15, color='k', rotation=0) ## 设置x和y轴的名称
plt.ylabel('电压', fontsize=15)
plt.xlim(-1, 11) # 设置x和y轴的范围
plt.ylim(-1.2, 1.2)
plt.xticks(np.arange(0, 12, 2), fontsize=15, rotation=0) # 设置x和y周的刻度
plt.yticks([-1, -0.5, 0, 0.5, 1])
# 绘制散点图
plt.scatter(x, y, c='blue', s=10, marker='+', label='sin(x)') # s参数是size

2、饼图
饼图一般用作观察数据的占比情况。
python
# 生成画布
plt.figure(figsize=(8,4))
# 定义饼图相关的数据
values = [63.54, 34.76, 78.46]
labels = ['第一部分', '第二部分', '第三部分']
colors = ['red', 'blue', 'green']
# 绘图
explode = (0.15, 0, 0) # 将某部分的内容分离出来,指定的值就是分割出来的块和其他两块之间的距离
# labeldistance 设置文本标签离圆心的位置,1.1表示离圆心是1.1倍半径的距离
# autopct 设置文本表示百分比的占比,.1f表示设置百分比的有效位数
plt.pie(values, explode=explode, labels=labels,colors=colors, labeldistance=1.1,
autopct = '%.1f%%',
shadow = True,
startangle = 45, pctdistance = 0.6)
plt.axis('equal') # 设置圆形显示的纵横比
plt.title('分布占比图', color='r')
plt.legend();

3、柱状图
饼图一般是用于查看分类数据的占比,而柱状图和条形图一般是用于查看分类数据的绝对值。
python
# 柱状图
x = np.array([1,2,3,4,5,6])
y = np.array([866, 787, 964, 654, 798, 993])
# [(1, 866), (2, 787)...]
plt.bar(x, y, width=0.5, label='销售业绩')
plt.legend(loc=0);
# 添加标题
plt.title('上半年每月业绩表现')
# 添加数据标签
for a, b in zip(x, y): # zip函数作用自动把x和y数组中的每一个值一一对应起来形成一个元组
plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
# 设置自定义x轴刻度值
plt.xticks(x, [str(i+1)+'月' for i in range(6)])
plt.show();

如果想对条形图的数据进行排序后再做图,可以使用dict字典格式来实现:
python
dic = {'1月': 2001, '2月': 3409, '3月': 2983, '4月': 2001, '5月': 2763, '6月': 2908}
# 针对dic进行排序
dic = dict(sorted(dic.items(), key = lambda kv:(kv[1], kv[0]), reverse=True))
plt.bar(dic.keys(), dic.values(), width=0.5, label='销售业绩')
4、直方图
直方图是一种观测数据频数的统计图,形式上跟柱状图一样,也是一个一个的长条。但是直方图是用长条形的面积表示频数或者概率,宽度表示组距,高度表示频数/组距,其长度和宽度均有意义。当宽度相同时,一般就用长条形长度表示频数。
直方图和柱状图的区别是,柱状图主要用于类别数据,而直方图主要用于连续数据。
python
# 生成数据
data= np.random.randn(1000) # 生成1000个符合正态分布的随机数, 均值为0,方差1
# bins参数表示将所有的数据等分成100份
plt.hist(data, bins=100, density=False, facecolor='b', edgecolor='k', alpha=0.7)
plt.xlabel('区间')
plt.ylabel('频次') # 出现的总的次数
plt.title('直方图')
plt.show();

试试将 density=False 修改为 True,看看会发生什么变化。