适用于比较多个数据
import matplotlib.pyplot as plt
import random
import pandas as pd
#显示全部列
pd.set_option('display.max_columns', None)
#显示全部行
pd.set_option('display.max_row', None)
#设置数据的显示长度(解决自动换行)
pd.set_option('display.width', None)
# 中文乱码
plt.rcParams['font.sans-serif']=['SimHei']
# 设置画布大小
plt.figure(figsize=(10, 6))
# 设置网格线
plt.grid(axis='y', linestyle=':')
# 读表
df = pd.read_excel(r'F:\练习\可视化\产品销售情况.xlsx')
x = df['产品名称']
y = df['总量']
# 设置标签
plt.xlabel('产品名称')
plt.ylabel('销量')
plt.title('产品销售情况', fontsize=18)
# 设置文本标签
for a, b in zip(x, y):
plt.text(a, b, format(b, ','), ha='center', va='bottom', alpha=0.9)
plt.bar(x, y, alpha=0.5, label='销售额')
# 设置图例
plt.legend()
plt.show()
柱形图语法格式:plt.bar(x, height, width, *, align='center', **kwargs)
height一般为y值
width为宽度,默认为0.8
*表示后面的参数为命名参数
align表示对齐方式,默认为center
**kwargs表示关键字参数
若直接多个柱形图输出(如下),会直接在原来柱子上叠加
plt.bar(x, y1, alpha=0.5, label='第一季度销售额')
plt.bar(x, y2, alpha=0.5, label='第二季度销售额')
plt.bar(x, y3, alpha=0.5, label='第三季度销售额')
plt.bar(x, y4, alpha=0.5, label='第四季度销售额')
plt.show()
因此要使y2,y3,y4在原来的基础上偏移一个width,才能实现并排显示。
由于字符型和浮点型不能直接相加,首先需要将x转换为列表([1, 2, 3……])转换为数组
# 导入numpy库
import numpy as np
# 将x转化为数组
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
# 设置柱形宽度
bar_width=0.2
# 设置文本标签
for a, b in zip(x, y1):
plt.text(a, b, format(b, ','), ha='center',
va='bottom', alpha=0.9, fontsize=6)
for a, b in zip(x, y2):
plt.text(a+bar_width, b, format(b, ','), ha='center',
va='bottom', alpha=0.9, fontsize=6)
for a, b in zip(x, y3):
plt.text(a+2*bar_width, b, format(b, ','), ha='center',
va='bottom', alpha=0.9, fontsize=6)
for a, b in zip(x, y4):
plt.text(a+3*bar_width, b, format(b, ','), ha='center',
va='bottom', alpha=0.9, fontsize=6)
# 绘制图像
plt.bar(x, y1, width=0.2,alpha=0.5, label='第一季度销售额')
plt.bar(x+bar_width, y2, width=0.2, alpha=0.5, label='第二季度销售额')
plt.bar(x+2*bar_width, y3,width=0.2, alpha=0.5, label='第三季度销售额')
plt.bar(x+3*bar_width, y4,width=0.2, alpha=0.5, label='第四季度销售额')
#将x轴用产品名称代替
data = df['产品名称']
plt.xticks(x, data)