# 制作柱形图(方法一)
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4)) # 创建一个绘图窗口
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.bar(x, y, width=0.5, align='center', color='k') # 根据给出的数据制作柱形图
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作柱形图(方法二)
from pyecharts.charts import Bar
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
chart = Bar() # 创建一个空白柱形图
chart.add_xaxis(x) # 为图表添加x坐标的值
chart.add_yaxis('销售量', y)
chart.render('柱形图.html') # 将制作的图表保存为网页文件

# 制作折线图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.plot(x, y, color='k', linewidth=3, linestyle='solid', marker='s', markersize=10) # 根据给出的数据制作折线图
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作饼图
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 4))
x = ['上海', '北京', '深圳', '重庆', '大连', '成都', '天津']
y = [120, 150, 88, 70, 96, 50, 40]
plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5, counterclock=False, startangle=90, explode=[0.3, 0, 0, 0, 0, 0, 0]) # 将饼图中的第1个饼图块分离出来
# 如果不分离饼图块,plt.pie(y,labels=x,labeldistance=1.1,autopct='%.2f%%',pctdistance=1.5,counterclock=False,startangle=90)
# 制作圆环图可通过设置该函数的参数wedgeprops来实现
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 添加图表标题和图例
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.bar(x, y, width=0.5, align='center', color='k', label='销售量(台)') # 根据给出的数据制作柱形图
plt.legend(loc='best', fontsize=12) # 为图表添加图表标题
plt.title(label='销售量对比图', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 25}, loc='center')
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 添加数据标签
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.bar(x, y, width=0.5, align='center', color='k')
for a, b in zip(x, y):
    plt.text(x=a, y=b, s=b, ha='center', va='bottom', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 15}) # 添加并设置数据标签
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 添加坐标轴标题
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.bar(x, y, width=0.5, align='center', color='k')
plt.xlabel('月份', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.ylabel('销售量(台)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 添加网格线
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.plot(x, y, color='k', linewidth=3, linestyle='solid')
plt.grid(b=True, axis='both', color='r', linestyle='dotted', linewidth=1)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 调整坐标轴的刻度范围
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [100, 90, 88, 70, 66, 50, 40, 55, 56, 88, 95, 98]
plt.plot(x, y, color='k', linewidth=3, linestyle='solid')
plt.title(label='销售量趋势图', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 25}, loc='center')
plt.ylim(20, 120) # 设置y轴的刻度范围
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 在一张画布中绘制多个图表
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
x = ['上海', '北京', '深圳', '重庆', '大连', '成都', '天津']
y = [120, 150, 88, 70, 96, 50, 40]
plt.subplot(2, 2, 1) # 将整张画布划分为2行2列,并指定在第1个区域中绘制图表
plt.bar(x, y, width=0.5, align='center', color='r')
plt.subplot(2, 2, 2)
plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.6)
plt.subplot(2, 2, 3)
plt.plot(x, y, color='r', linewidth=3, linestyle='solid')
plt.subplot(2, 2, 4)
plt.stackplot(x, y, color='r')
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 在一个工作表中插入图表
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
figure = plt.figure(figsize=(10, 4))
data = pd.read_excel('各月销售数量表.xlsx', sheet_name='1月')
x = data['配件名称']
y = data['销售数量']
plt.bar(x, y, width=0.5, align='center', color='k')
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
app = xw.App(visible=False, add_book=False)
workbook = app.books.open('各月销售数量表.xlsx') # 打开要插入图表的工作簿
worksheet = workbook.sheets['1月']
worksheet.pictures.add(figure, left=500) # 在指定工作表中插入柱形图
workbook.save('各月销售数量表1.xlsx')
workbook.close()
app.quit()

# 在一个工作簿的所有工作表中插入图表
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw
all_data = pd.read_excel('各月销售数量表.xlsx', sheet_name=None)
app = xw.App(visible=False, add_book=False)
workbook = app.books.open('各月销售数量表.xlsx')
worksheet = workbook.sheets
for i in all_data:
    figure = plt.figure(figsize=(10, 4))
    data = all_data[i]
    x = data['配件名称']
    y = data['销售数量']
    plt.bar(x, y, width=0.5, align='center', color='k')
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    worksheet[i].pictures.add(figure, left=500)
workbook.save('各月销售数量表1.xlsx')
workbook.close()
app.quit()

# 制作散点图
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
figure = plt.figure(figsize=(10, 4))
data = pd.read_excel('客户满意度表.xlsx', sheet_name='Sheet1')
x = data['收货天数(天)']
y = data['客户满意度']
plt.scatter(x, y, s=100, marker='o', color='k')
x1 = x.to_numpy().reshape(-1, 1) # 将自变量数据转换为二维数组格式
model = linear_model.LinearRegression().fit(x1, y) # 创建并训练了一个线性回归模型
y1 = model.predict(x1) 
plt.plot(x, y1, color='k', linewidth='3', linestyle='solid') # 根据预测结果制作了一条线性趋势线
plt.title(label='收货天数与客户满意度关系图', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 25}, loc='center')
plt.xlabel('收货天数(天)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.ylabel('客户满意度', fontdict={'family': 'SimSun', 'color': 'k', 'size': 12}, labelpad=2)
plt.xlim(0, 22.5) # 设置坐标轴的刻度范围
plt.ylim(0, 12)
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作涟漪特效散点图
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import EffectScatter
data = pd.read_excel('客户满意度表.xlsx', sheet_name='Sheet1')
x = data['收货天数(天)']
y = data['客户满意度']
chart = EffectScatter()
chart.add_xaxis(x) # 为散点图添加x坐标的值
chart.add_yaxis(series_name='收货天数(天),客户满意度', y_axis=y, label_opts=opts.LabelOpts(is_show=False), symbol_size=15)
chart.set_global_opts(title_opts=opts.TitleOpts(title='收货天数与客户满意度散点图'), yaxis_opts=opts.AxisOpts(type_='value', name='客户满意度', name_location='middle', name_gap=40), xaxis_opts=opts.AxisOpts(type_='value', name='收货天数(天)', name_location='middle', name_gap=40), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='{a}:{c}')) # 为图表添加图表标题和坐标轴标题
chart.render('散点图.html') # 将制作的散点图保存为一个网页文件

# 制作气泡图
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(figsize=(10, 5))
data = pd.read_excel('销售统计表.xlsx', sheet_name='Sheet1')
n = data['产品名称'] # 指定“产品名称”的数据作为数据标签的内容
x = data['销售量(台)']
y = data['销售额(元)']
z = data['毛利率(%)'] # 指定“毛利率(%)”作为气泡大小
plt.scatter(x, y, s=z * 5000, color='r', marker='o')
plt.xlabel('销售量(台)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 12}, labelpad=2)
plt.ylabel('销售额(元)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 12}, labelpad=2)
plt.title('销售量、销售额与毛利率关系图', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 20}, loc='center')
for a, b, c in zip(x, y, n):
    plt.text(x=a, y=b, s=c, ha='center', va='center', fontsize=12, color='w')
plt.xlim(20, 100)
plt.ylim(0, 50000)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作组合图表
import pandas as pd
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 5))
data = pd.read_excel('各月销售额统计表.xlsx', sheet_name='Sheet1')
x = data['月份']
y1 = data['销售额(万元)']
y2 = data['同比增长率']
plt.bar(x, y1, color='y', label='销售额(万元)') # 使用第1组y坐标值绘制了一个柱形图
plt.legend(loc='upper left', fontsize=12)
plt.twinx()
plt.plot(x, y2, color='r', linewidth='3', label='同比增长率') # 使用第2组y坐标值绘制了一个折线图
plt.legend(loc='upper right', fontsize=10)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作雷达图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
colors = ['r', 'g', 'y'] # 设置每个员工在图表中的显示颜色
data = pd.read_excel('员工能力评价表.xlsx', sheet_name='Sheet1', index_col=0).T
staff = data.index.to_list() # 从行索引中获取员工名称
# 如只显示“A员工”的数据,则将这行代码修改为“staff=['A员工']”
column = data.columns.to_list() # 从列索引中获取评价指标名称
angle = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(column), endpoint=False) # 根据评价指标的个数对圆形进行等分
angle = np.concatenate((angle, [angle[0]])) # 连接刻度线数据
column = np.concatenate((column, [column[0]])) # 连接指标名称数据
figure = plt.figure(figsize=(8, 6)) # 创建了一张宽8英寸、高6英寸的画布
ax = figure.add_subplot(1, 1, 1, projection='polar') # 将这张画布划分为1行1列,指定在第1个区域中绘图,并设置坐标体系为极坐标
for i, j in enumerate(staff):
    staff_data = data.loc[j] # 获取员工的指标分值数据
    staff_data = np.concatenate((staff_data, [staff_data[0]])) # 连接员工的指标分值数据
    ax.plot(angle, staff_data, linestyle='-', linewidth=2, color=colors[i], label=str(j)) # 制作雷达图
    ax.fill(angle, staff_data, color=colors[i], alpha=0.7) # 为雷达图填充颜色
ax.legend(loc=4, bbox_to_anchor=(1.15, -0.07)) # 参数loc=4表示将图例放置在右下角
ax.set_thetagrids(angle * 180 / np.pi, column, fontsize=12)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

# 制作漏斗图
import pyecharts.options as opts
from pyecharts.charts import Funnel
x = ['浏览商品', '放入购物车', '生成订单', '支付订单', '完成交易']
y = [1200, 800, 300, 280, 250]
data = [i for i in zip(x, y)]
chart = Funnel()
chart.add(series_name='人数', data_pair=data, label_opts=opts.LabelOpts(is_show=True, position='inside'), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='{a}:{c}')) # 添加并设置图表的系列名称、系列数据值和提示框等
chart.set_global_opts(title_opts = opts.TitleOpts(title='电商网站流量转化漏斗图', pos_left='center'), legend_opts=opts.LegendOpts(is_show=False))
chart.render('漏斗图.html')

# 制作水球图
import pyecharts.options as opts
from pyecharts.charts import Liquid
actual_sale1 = 900000
actual_sale2 = 1589000
actual_sale3 = 285200
target_sale = 1200000 # 指定了3个地区共同的目标销售业绩
chart = Liquid()
chart.set_global_opts(title_opts=opts.TitleOpts(title='各地区销售业绩达成率', pos_left='center'))
chart.add(series_name='北京', data=[actual_sale1 / target_sale], shape='circle', center=['20%', '50%'])
chart.add(series_name='上海', data=[actual_sale2 / target_sale], shape='circle', center=['50%', '50%'])
chart.add(series_name='成都', data=[actual_sale3 / target_sale], shape='circle', center=['80%', '50%'])
chart.render('水球图.html')

# 制作仪表盘
import pyecharts.options as opts
from pyecharts.charts import Gauge
chart = Gauge()
chart.add(series_name='业务指标', data_pair=[('完成率', 70.95)], split_number=10, radius='75%', start_angle=225, end_angle=-45, is_clock_wise=True, title_label_opts=opts.GaugeTitleOpts(font_size=30, color='red', font_family='Microsoft YaHei'), detail_label_opts=opts.GaugeDetailOpts(is_show=False))
chart.set_global_opts(legend_opts=opts.LegendOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=True, formatter='{a}<br/>{b}:{c}%'))
chart.render('仪表盘.html')

# 制作词云图
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import WordCloud
data = pd.read_excel('图书销量表.xlsx', sheet_name='Sheet1')
name = data['书名']
value = data['销售量(本)']
data1 = [i for i in zip(name, value)] # 将列表name和value中对应的元素配对打包成一个个元组,然后将这些元组组成一个列表
chart = WordCloud()
chart.add('销售量(本)', data_pair=data1, shape='star', word_size_range=[10, 60])
chart.set_global_opts(title_opts=opts.TitleOpts(title='图书销量分析', title_textstyle_opts=opts.TextStyleOpts(font_size=30)), tooltip_opts=opts.TooltipOpts(is_show=True))
chart.render('词云图.html')