总 结
1折线图plot
1.1参数配置:
x = df['日期'] # x轴数据
y = df['销量'] # y轴数据
# figsize:画布大小,长*高
# dpi:分辨率
# facecolor:背景颜色
plt.figure(figsize=(5, 3), facecolor='gray', dpi=100)
# color:线条颜色
# linestyle:线条样式
# marker:标记样式(形状)
# mfc:marker face color标记背景颜色
plt.plot(x, y, color='blue', linestyle='-', marker='o', mfc='white', label='销量')
# title: 图表标题
# fontsize:字体大小
plt.title(label='2021年6月1-15日的销量折线图', loc='center', fontsize=18)
plt.xlabel('2021年6月') # x轴标题
plt.ylabel('销量', rotation=0) # y轴标题
# xticks:设置x轴刻度
plt.xticks(ticks=df['日期'],
labels=[str(x) + '日' for x in df['日期']],
rotation=30)
plt.yticks(ticks=range(0, 120, 10))
# 设置x轴刻度范围
plt.xlim(0, 15)
# 设置y轴刻度范围
plt.ylim(0, 140)
# grid:网格线
# linewidth:线条宽度
plt.grid(color='0.5', linestyle=':', linewidth=1, axis='y')
for a, b in zip(x, y):
# text:数据标签
plt.text(x=a, # x坐标值
y=b+5, # y坐标值
s='{:.0f}'.format(b), # 显示内容及格式
ha='center', # 水平居中
va='bottom', # 垂直靠下
fontsize=10)
# legend: 图例
# 插入数据后,再添加图例
plt.legend(loc='upper left')
plt.annotate(text='最高销量', # 注释内容
xy=(13, 98), # 被注释的坐标点
xytext=(12, 50), # 注释内容的坐标点
arrowprops=dict(facecolor='b', width=0.5, headwidth=4))
# 先保存本地,再显示图形
plt.savefig('02-折线图.png')
plt.show()
1.2多条折线图
# x = df['月份']
# y1 = df['键盘']
# y2 = df['鼠标']
# y3 = df['音响']
x, y1, y2, y3 = df['月份'], df['键盘'], df['鼠标'], df['音响']
plt.figure(figsize=(5, 3), dpi=150)
plt.title('各产品销量折线图', fontsize='18')
plt.plot(x, y1, label='键盘', color='y', marker='p')
# ms:marker size标记大小
# alpha:透明度
plt.plot(x, y2, label='鼠标', color='g', marker='.', mfc='r', ms=8, alpha=0.7)
plt.plot(x, y3, label='音响', color='b', marker='*', linestyle='-.')
plt.hlines(y=88, xmin=0, xmax=9, linestyles=':', color='#d50000')
plt.grid(axis='y')
plt.ylabel('销量')
plt.yticks(range(0, 110, 10))
# plt.ylim(0)
plt.legend()
# plt.legend(['键盘', '鼠标', '音响'])
plt.show()
2柱形图bar
2.1普通柱形图
x, y = df['年份'], df['销售额']
plt.figure(figsize=(5, 3), dpi=150)
plt.title('14-20年销售额趋势')
plt.xlabel('年份')
plt.ylabel('销售额')
plt.bar(x, y, width=0.5)
for a, b in zip(x, y):
plt.text(x=a, y=b, s='{:.0f}万'.format(b / 10000), fontsize=8, ha='center')
plt.legend(['销售额'])
plt.show()
2.2簇状柱形图
x, y1, y2, y3 = df['年份'], df['北区'], df['中区'], df['南区']
plt.figure(figsize=(5, 3), dpi=150)
plt.title('14-20年各区销售额对比')
plt.xlabel('年份')
plt.ylabel('销售额')
width = 0.25
# 避免图形重叠
# 柱形的宽度必须与x值的偏移量保持一致
plt.bar(x - width, y1, width=width, color='g')
plt.bar(x, y2, width=width, color='y')
plt.bar(x + width, y3, width=width, color='b')
plt.xticks(ticks=range(2014, 2021, 1),
labels=[str(x) + '年' for x in df['年份']],
rotation=20)
plt.legend(['北区', '中区', '南区'], ncol=3, fontsize=8)
plt.show()
2.3堆积柱形图
x, y1, y2, y3 = df['年份'], df['北区'], df['中区'], df['南区']
plt.figure(figsize=(5, 3), dpi=150)
plt.title('14-20年各区销售额堆积')
plt.xlabel('年份')
plt.ylabel('销售额')
plt.bar(x, y1, label='北区')
plt.bar(x, y2, label='中区', bottom=y1)
plt.bar(x, y3, label='南区', bottom=y1 + y2)
for a, b in zip(x, y1):
plt.text(x=a,
y=b, # 显示的位置
s='{:.0f}万'.format(b / 10000), # 实际值
ha='center',
va='top',
fontsize=6)
for a, b, c in zip(x, y1, y2):
plt.text(x=a,
y=b + c, # 显示的位置
s='{:.0f}万'.format(c / 10000), # 实际值
ha='center',
va='bottom',
fontsize=6)
for a, b, c, d in zip(x, y1, y2, y3):
plt.text(x=a,
y=b + c + d, # 显示的位置
s='{:.0f}万'.format(d / 10000), # 实际值
ha='center',
va='bottom',
fontsize=6)
plt.legend(ncol=3)
plt.show()
3直方图:hist
x = df['价格']
plt.figure(figsize=(5, 3), dpi=150)
plt.xlabel('价格') # 容易误解为x刻度标签
plt.ylabel('单数') # 容易误解为y刻度标签
# plt.xticks()
# plt.yticks()
plt.title('价格分布直方图')
# plt.xlim(40, 100)
plt.xticks(ticks=range(40, 110, 5))
plt.hist(x,
bins=range(40, 110, 5),
facecolor='blue', # 背景颜色
edgecolor='black', # 边框颜色
alpha=0.7)
plt.show()
4饼图:pie
plt.figure(figsize=(5, 3), dpi=150)
labels = df['区域']
sizes = df['销量']
plt.pie(
# 指标
x=sizes,
# 区域标签
labels=labels,
# 设置百分比
autopct='%.1f%%',
# 数据标签字体
textprops={'fontsize': 5},
explode=(0.1, 0, 0, 0, 0, 0),
)
plt.title('各区销量占比情况')
plt.show()
5散点图:scatter
# 散点图:观测两个变量之间的相关性
x = df['广告费用']
y = df['销售收入']
plt.figure(figsize=(5, 3), dpi=150)
plt.title('广告费用与销售收入的相关性')
plt.xlabel('广告费用')
plt.ylabel('销售收入')
plt.scatter(x, y)
text = '相关系数:' + str(round(df['广告费用'].corr(df['销售收入']), 2))
plt.text(x=5000, y=90000, s=text)
plt.show()
6面积图:stackplot
7热力图:imshow
# 热力图数据,多行多列的二维数组
data = df.drop('区域', axis=1).values
# df[['产品A', '产品B', '产品C', '产品D', '产品E', '产品F']]
x = df.drop('区域', axis=1).columns # x轴标签,一维
y = df['区域'] # y轴标签,二维
plt.figure(dpi=150)
# cmap,color map颜色映射
plt.imshow(data, cmap='Blues')
# 添加数据标签
for i in range(len(x)): # 列号
for j in range(len(y)): # 行号
plt.text(x=i, y=j, s=data[j, i], ha='center', va='center')
plt.xticks(ticks=range(len(x)), labels=x)
plt.yticks(ticks=range(len(y)), labels=y)
plt.colorbar() # 颜色条,或视觉映射
plt.title('各区域各产品的销量热力图')
plt.show()
8箱线图boxplot
# 观测数据的集中趋势和离散程度
plt.figure(figsize=(5, 3), dpi=100)
plt.boxplot(x=data,
labels=labels,
whis=1, # 基于n倍的四分位距来检测异常值
# IQR=Q3-Q1
# upper=Q3+1*IQR,最大不超过最大值
# lower=Q1-1*IQR,最小不低于最小值
flierprops={
# 异常点标记的背景颜色
'markerfacecolor': 'white',
# 异常点标记的边框颜色
'markeredgecolor': 'red',
# 异常点标记的大小
'markersize': 3
})
plt.show()
9雷达图polar
plt.figure(dpi=100)
plt.polar(angles, male, 'b', label='男生')
plt.polar(angles, female, 'g', label='女生')
# plt.xticks:针对直角坐标系
# plt.yticks:针对直角坐标系
# plt.thetagrids: 针对极坐标系
plt.thetagrids(angles=range(0, 360, 60), labels=labels)
plt.ylim(0, 100)
plt.legend(fontsize=6)
plt.show()
10多子图subplot
df['月份'] = df['订单日期'].dt.month
plt.figure(figsize=(5, 8), dpi=150)
# 第1个子图-饼图
plt.subplot(3, 1, 1)
df2 = df.groupby('产品类别').agg({'销售额': 'sum'}).reset_index()
plt.title('各产品的销售额占比')
plt.pie(x=df2['销售额'],
wedgeprops=dict(edgecolor='w'),
autopct='%.1f%%',
labels=df2['产品类别'])
# 设置紧凑布局,避免重叠
plt.tight_layout()
# 第2个子图-折线图
plt.subplot(3, 1, 2)
df1 = df.groupby('月份').agg({'销售额': 'sum'}).reset_index()
plt.xticks(ticks=range(0, len(df1['月份']) + 1, 1))
plt.ylim(0, max(df1['销售额']))
# plt.ylim(0, 600000)
plt.xlabel('月份')
plt.title('各月的销售额趋势')
plt.plot(df1['月份'], df1['销售额'], label='销售额')
# 设置紧凑布局,避免重叠
plt.tight_layout()
# 第3个子图-柱形图
plt.subplot(3, 1, 3)
df3 = df.groupby('地区').agg({'销售额': 'sum'}).reset_index()
plt.title('各区的销售额对比')
plt.bar(df3['地区'], df3['销售额'])
# 设置紧凑布局,避免重叠
plt.tight_layout()
plt.show()
11组合图twinx
x, y1, y2 = df['月份'], df['销量'], df['转化率']
plt.figure(dpi=100)
plt.bar(x=x, height=y1)
plt.ylabel('销量')
plt.title('1-6月的销量及转化率趋势')
for a, b in zip(x, y1):
plt.text(x=a, y=b, s=b, ha='center')
# 共享x轴,添加一个y轴
# 绘制次y轴的折线图
plt.twinx()
plt.plot(x, y2, color='g', marker='o')
plt.ylim(0, 1)
plt.ylabel('转化率')
for a, b in zip(x, y2):
plt.text(x=a, y=b + 0.05, s='{:.1%}'.format(b), ha='center')
plt.show()