python_数据可视化_from:林骥

from:林骥 https://github.com/linjiwx/mp

学习大神的数据分析思维,数据可视化技巧,以后有需要画类似图的时候,可以提供一些思路。

地图

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

# 导入所需的库
import pandas as pd
import numpy as np
from plotnine import *
from pylab import mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes
from matplotlib.collections import PatchCollection
from matplotlib import cm, colors

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x) 

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 从 Excel 文件中读取数据
df = pd.read_excel('./data/中国省份坐标.xlsx')
gdp = pd.read_excel('./data/各省2019年GDP数据.xlsx')

# 计算每个省份的中心坐标
df_center = df.groupby('Province').mean()

# 合并省份坐标和数据
dfxy = pd.merge(df_center, gdp, on='Province', how ='left')

# 定义颜色数值
color_value = np.array(dfxy.GDP)
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax = plt.subplots(figsize=(16, 9))

# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')

# 设置标题
ax.set_title('\n各省 2019 年的 GDP 数据', loc='center', fontsize=26)

# 循环设置每个省份
patches = []
for Province in np.unique(df['Province']):
    # 筛选每个省份的数据
    dfp = df[df['Province'] == Province]
    
    # 多边形的每个位置
    rect = mpathes.Polygon([(x, y) for x, y in zip(dfp['x'], dfp['y'])])
    patches.append(rect)
    
    # 多边形内部显示省份名称和数据
    ax.text(df_center.loc[Province].x, df_center.loc[Province].y, 
            '\n'+Province+'\n'+'%.2f' % dfxy[dfxy['Province'] == Province].GDP.values[0], 
            fontsize=15, va='center', ha='center', color=c['深灰色'])
    
# 填充形状和颜色
collection = PatchCollection(patches, alpha=0.5, cmap=plt.cm.Oranges, ec=c['浅灰色'], fc='w', lw=1)
collection.set_array(color_value)
ax.add_collection(collection)

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

# 隐藏 X、Y 轴
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)

# 避免变形
plt.axis('equal')

plt.show()

条形图

1 对比条形图

在这里插入图片描述

在这里插入图片描述

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
其次,从 Excel 文件中读取随机模拟的数据,并定义画图用的数据。

# 数据源路径
filepath='./data/问卷调查结果2.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath, index_col='功能')

# 定义画图用的数据
category_names = df.index
labels = df.columns
data = df.values
接下来,开始用「面向对象」的方法进行画图。

# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(8, 6))

# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')

# 设置标题
ax.text(0, -1, '\n用户满意度随时间的变化', fontsize=26, ha='left', color=c['深灰色'])

# 设置 X 轴的取值范围
ax.set_xlim(0, 1)

# 倒转 Y 轴,让第一个功能排在最上面
ax.invert_yaxis()

# 定义颜色
category_colors = [c['灰色'], c['灰色'], c['橙色'], c['浅蓝色'], c['浅蓝色']]

# 定义条形图所处的位置和高度
x = np.arange(len(category_names))
height = 0.35

# 画条形图
bar1 = ax.barh(x-height/2, data[:, 0], height, label=labels[0], color=c['浅灰色'])
bar2 = ax.barh(x+height/2, data[:, 1], height, label=labels[1], color=category_colors)

# 设置 Y 轴标签字体大小和颜色
plt.yticks(range(len(category_names)), ' ' + category_names, ha='left', color=c['深灰色'], size=18)
# ax.set_yticks(range(len(category_names)))
# ax.set_yticklabels(category_names + ' ')
# ax.tick_params(labelsize=18, colors=c['深灰色'])

# 设置标签的字体大小
fontsize = 16

# 设置第一个条形图的数据标签
for (i, rect) in zip(range(len(bar1)), bar1):
    w = rect.get_width()
    ax.text(w, rect.get_y()+rect.get_height()/2, labels[0], ha='right', va='center', color=c['灰色'], fontsize=fontsize)
    ax.text(w, rect.get_y()+rect.get_height()/2, ' %.0f%%' % (w*100), ha='left', va='center', color=c['深灰色'], fontsize=fontsize)
    
# 设置第二个条形图的数据标签
for rect in bar2:
    w = rect.get_width()
    ax.text(w, rect.get_y()+rect.get_height()/2, labels[1], ha='right', va='center', color=c['浅灰色'], fontsize=fontsize)
    ax.text(w, rect.get_y()+rect.get_height()/2, ' %.0f%%' % (w*100), ha='left', va='center', color=c['深灰色'], fontsize=fontsize)
    
# 隐藏 X 轴
ax.xaxis.set_visible(False)

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

# 隐藏 Y 轴的刻度线
ax.tick_params(axis='y', which='major', length=0)

plt.show()

2 堆积条形图

在这里插入图片描述
在这里插入图片描述

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from datetime import timedelta

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

# 数据源路径
filepath=r'C:\Users\Administrator\Desktop\用户评分占比2.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath, index_col='功能')

# 定义画图用的数据
category_names = df.columns
labels = df.index
data = df.values
data_cum = data.cumsum(axis=1)


# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(9, 5))

# 设置标题
ax.set_title('\n用户对功能 A 最为满意\n\n', fontsize=26, loc='left', color=c['深灰色'])

# 倒转 Y 轴,让第一个功能排在最上面
ax.invert_yaxis()

# 隐藏 X 轴
ax.xaxis.set_visible(False)
# 设置 X 轴的范围
ax.set_xlim(0, np.sum(data, axis=1).max())

# 定义颜色
category_colors = [c['橙色'], c['橙色'], c['灰色'], c['蓝色'], c['蓝色']]

# 画堆叠水平条形图
for i, (colname, color) in enumerate(zip(category_names, category_colors)):
    widths = data[:, i]
    starts = data_cum[:, i] - widths
    ax.barh(labels, widths, left=starts, height=0.68, label=colname, color=color, edgecolor='w')
    xcenters = starts + widths / 2

    # 设置数据标签及其文字颜色
    text_color = 'w'
    for y, (x, d) in enumerate(zip(xcenters, widths)):
        ax.text(x, y, '{:.0%}'.format(d), ha='center', va='center', color=text_color, fontsize=16)
        
# 显示图例
l = ax.legend(ncol=len(category_names), bbox_to_anchor=(-0.03, 0.95),loc='lower left', 
              fontsize=16, frameon=False, handlelength=0.6)

#设置图例中文本的颜色
for i, text in zip(np.arange(len(l.get_texts())), l.get_texts()):
    if i < 2:
        text.set_color(c['橙色'])
    elif i < 3:
        text.set_color(c['灰色'])
    else:
        text.set_color(c['蓝色'])

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

# 隐藏 Y 轴的刻度线
ax.tick_params(axis='y', which='major', length=0)

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=c['深灰色'])

plt.show()

3 动态条形图

在这里插入图片描述

https://public.flourish.studio/visualisation/3280860/

另外

AkShare 是基于 Python 的开源金融数据接口库,目的是实现对股票、期货、期权、基金、债券、外汇等金融产品和另类数据从数据采集,数据清洗到数据下载的工具,满足金融数据科学家、数据科学爱好者在数据获取方面的需求。它的特点是利用 AkShare 获取的是基于可信任数据源发布的原始数据,广大数据科学家可以利用原始数据进行再加工,从而得出科学的结论。
https://www.akshare.xyz/zh_CN/latest/introduction.html#

在这里插入图片描述

import akshare as ak
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
stock_df = ak.zdzk_fund_index(30, plot=False)
futures_df = ak.zdzk_fund_index(32, plot=False)
fig = plt.figure(111, figsize=(20, 10), dpi=300)
adjust_stock_df = stock_df["20150102":] / stock_df["20150102"] * 1000
adjust_stock_df.plot(linewidth=4)
adjust_futures_df = futures_df["20150102":] / futures_df["20150102"] * 1000
adjust_futures_df.plot(linewidth=4)
plt.title("index example")
plt.legend()
plt.show()

在这里插入图片描述

柱形图

在这里插入图片描述

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
colors = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
          '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
          '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

# 定义几个模拟的数据
df = pd.DataFrame({'产品':['产品 A', '产品 B', '产品 C', '产品 D'], '销量':[66, 23, 26, 29]})

# 画图用的数据定义
x = df['产品']
y = df['销量']

# 平均值
avg = y.mean()

fig, ax = plt.subplots(figsize=(8, 6))

# 设置标题
ax.set_title("  产品 A 的销量遥遥领先" % (y[0] / y[1]), fontsize=26, loc='left', color=colors['深灰色'])

# 画柱形图
ax.bar(x, y, width=0.6, color=colors['蓝色'])

# 平均值线
lc = ax.hlines(avg, -0.5, len(x)-0.5, color=colors['灰色'], label='平均值', ls='--')
# 设置线条宽度
lc.set_linewidth(2)
# 文字标注平均值
ax.text(2, avg+2, "平均值:%.1f" % avg, fontsize=20, ha='center', color=colors['灰色'])

# 用双箭头强调对比的关系
ax.annotate('', xy=(0.5, df.iloc[0, 1]), xytext=(0.5, df.iloc[1, 1]), arrowprops=dict(arrowstyle='<->', color=colors['橙色'], lw=3))
# 文字标注两个柱形图的倍数关系
ax.text(0.55, y[:2].mean(), "%.1f倍" % (y[0] / y[1]), fontsize=20, color=colors['橙色'])

# 设置数据标签
for a, b in zip(x, y):
    ax.text(a, b-6, '%.0f' % b, ha='center', va= 'bottom', fontsize=20, color='w')

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)

# 隐藏 Y 轴刻度
ax.set_yticks([])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=20, colors=colors['深灰色'])

plt.show()
  • 2
    在这里插入图片描述
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 定义数据
df = pd.DataFrame({'美国确诊人数':['第一个百万', '第二个百万', '第三个百万', '第四个百万'], '所花的天数':[98, 42, 30, 16]})
'''
  美国确诊人数  所花的天数
0  第一个百万     98
1  第二个百万     42
2  第三个百万     30
3  第四个百万     16
'''
# 画图用的数据定义
x = df['美国确诊人数']
y = df['所花的天数']

# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 6))

# 设置标题
ax.set_title('\n 美国百万确诊人数所花的天数越来越短\n', fontsize=28, loc='left', color=c['深灰色'])

# 画柱形图
ax.bar(x, y, width=0.6, color=c['蓝色'])

# 用箭头强调对比的关系
ax.annotate('', xy=(3, 26), xytext=(0.5, 98), arrowprops=dict(color=c['橙色'], connectionstyle="arc3,rad=0.25"))

# 设置数据标签
for a, b in zip(x, y):
    ax.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=22, color=c['深灰色'])

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)

# 隐藏 Y 轴刻度
ax.set_yticks([])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=20, colors=c['深灰色'])

plt.show()

折线图

  • 1
    在这里插入图片描述

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import timedelta

# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False  

# 读取每日销售数据
df = pd.read_excel(r'C:\Users\Administrator\Desktop\2019年9月每日销售.xlsx')

# 定义画图的数据
x = df.日期
y = df.实际销量

# 定义颜色
color1 = '#0085c3'
color2 = '#7ab800'
color3 = '#dc5034'

# 设置图像大小
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)

# 绘制折线图
ax.plot(x, y, marker='o', color=color1)

# 标注最大值
ax.text(x[y.idxmax()]+timedelta(hours=-12),
        y.max()+1, y.max(),
        color=color1, fontsize=15)

# 标注最小值
ax.text(x[y.idxmin()]+timedelta(hours=-9),
        y.min()-2, y.min(),
        color=color1, fontsize=15)

# 计算 7 天移动平均
y2 = y.rolling(7).mean()

# 绘制趋势线
ax.plot(x, y2, ls='--', color=color2, label='7 天移动平均')

# 绘制箭头
plt.annotate('', xy=(x[-1:], y2[-1:]),
             xytext=(x[-2:-1], y2[-2:-1]),
             arrowprops=dict(arrowstyle='->',
                             color=color2,
                             shrinkB=0))

# 绘制平均值线
ax.hlines(y.mean(), x[0], x[-1:],
          linestyles='-.', colors=color3)

# 标注平均值
ax.text(x[-1:]+timedelta(days=-7.5), y.mean()-2,
        '平均值: ' + str(round(y.mean(),1)),
        color=color3, fontsize=15)

# 标注特殊事件
ax.annotate('中秋节', xy=(x[y.idxmin()], y.min()), color=color1,
             xytext=(x[y.idxmin()]+timedelta(days=1.5), y.min()-2),
             arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

ax.annotate('打折促销', xy=(x[y.idxmax()], y.max()), color=color1,
             xytext=(x[y.idxmax()]+timedelta(days=-5), y.max()+2),
             arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

# 设置网格线
ax.grid(ls=':', color='gray', alpha=0.6)

# 设置图例的位置和大小
ax.legend(loc='upper left', fontsize=12)

# 设置坐标轴标签的角度和大小
plt.xticks(rotation=50, fontsize=8)
plt.yticks(fontsize=8)

# 设置 y 轴的刻度范围
ax.set_ylim(0, y.max()+5)

# 设置图表标题
_ = ax.set_title('2019年9月每日销量变化趋势', fontsize=20)
  • 2
    在这里插入图片描述

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from datetime import timedelta

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
colors = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
          '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
          '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

# 数据源路径
filepath=r'C:\Users\Administrator\Desktop\2019年9月每日销售.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath)

# 定义画图用的数据
x = [x.strftime('%m-%d') for x in df.日期]
y = df.实际销量

# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(10, 6))

# 设置标题
ax.text(-3.9, y.max()+6, '\n2019年9月每天产品销量的变化趋势\n', fontsize=26, color=colors['深灰色'])

# 绘制折线图
ax.plot(x, y, marker='o', color=colors['蓝色'], markevery=[y.idxmin(), y.idxmax()], mfc='w')

# 标注最大值对应的事件
ax.annotate('打折促销', xy=(x[y.idxmax()], y.max()), color=colors['蓝色'],
             xytext=(y.idxmax()-4.2, y.max()), 
             arrowprops=dict(arrowstyle='->', color=colors['蓝色']), fontsize=16)

# 标注最小值对应的事件
ax.annotate('中秋节', xy=(x[y.idxmin()], y.min()), color=colors['深灰色'],
             xytext=(y.idxmin()-3.6, y.min()), 
             arrowprops=dict(arrowstyle='->', color=colors['深灰色']), fontsize=16)

# 计算 7 天移动平均
y2 = y.rolling(7).mean()
# 绘制趋势线
ax.plot(x, y2, ls='-', color=colors['灰色'], label='七天移动平均')
# 绘制趋势线末端的箭头
plt.annotate('', xy=(x[-1:], y2[-1:]), xytext=(x[-2:-1], y2[-2:-1]), 
             arrowprops=dict(arrowstyle='->', color=colors['灰色'], shrinkB=0))
# 文字说明移动平均
ax.text(len(x)-7.8, y2[-8:-7], '七天移动平均', color=colors['深灰色'], fontsize=12, bbox=dict(facecolor='w', edgecolor='w'))

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_color(colors['灰色'])
ax.spines['left'].set_color(colors['灰色'])

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)

# 设置 X 轴显示的标签
xt = []
for i in np.arange(len(x)):
    if i % 5 == 0:
        xt.append(x[i])
    else:
        xt.append('')
xt[-1] = x[-1]
ax.set_xticklabels(xt, ha='left')

# 设置 X、Y 轴的标题,适当留白
ax.text(-0.1, -5, '日期', ha='left', fontsize=16, color=colors['深灰色'])
ax.text(-3.9, y.max()+6.8, '产\n品\n销\n量', va='top', fontsize=16, color=colors['深灰色'])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=colors['深灰色'])

# 设置 y 轴的刻度范围
ax.set_ylim(0, y.max()+6)

plt.show()
  • 3
    在这里插入图片描述


# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
colors = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
          '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
          '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171','红色':'#FF6666'}
# 数据源路径
filepath=r'C:\Users\Administrator\Desktop\2020年第一季度上证指数.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath).set_index('日期')

# 日期,开盘价,收盘价,最高价,最低价
x = df.index.strftime('%m-%d')
y1 = df['开盘价'].values
y2 = df['收盘价'].values
ymax = df['最高价'].values
ymin = df['最低价'].values

# 显示前 5 行数据,了解数据结构
df.head(5)
# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(10, 6))

# 设置标题
ax.set_title('\n2020年第一季度上证指数的变化\n', fontsize=26, loc='left', color=colors['深灰色'])

# 开始画图,时间线图(颜色/线条类型/标记)
ax.plot(x, y1, label='开盘价', color=colors['红色'], ls='-', lw=1, marker='o', markevery=[-1])
ax.plot(x, y2, label='收盘价',color=colors['蓝色'], ls='-', lw=2, marker='o', markevery=[-1])

# 填充区域
ax.fill_between(x, ymin, ymax, color=colors['浅灰色'])
# 提示填充区域的最大值和最小值
ax.text(-0.5, ymax[0]+20, '最高价', color=colors['深灰色'], fontsize=12)
ax.text(-0.5, ymin[0]-22, '最低价', color=colors['深灰色'], fontsize=12)

# 直接在折线图的旁边标记图例,并保持颜色一致
ax.text(len(x)+1, y1[-1]+26, '开盘价', fontsize=16, color=colors['浅蓝色'])
ax.text(len(x)+1, y2[-1]-52, '收盘价', fontsize=20, color=colors['蓝色'])

# 显示最后 n 个数据的标签
n = 1
# 设置第一条折线图的数据标签
for a, b in zip(x[-n:], y1[-n:]):
    plt.text(a, b+25, '%.0f' % b, ha='center', va= 'bottom', fontsize=12, color=colors['浅蓝色'])
# 设置第二条折线图的数据标签
for a, b in zip(x[-n:], y2[-n:]):
    plt.text(a, b-56, '%.0f' % b, ha='center', va= 'bottom', fontsize=16, color=colors['蓝色'])

# 设置 X 轴显示的标签
xt = []
for i in np.arange(len(x)):
    if i % 7 == 0:
        xt.append(x[i])
    else:
        xt.append('')
ax.set_xticklabels(xt)

#设置Y轴范围,便于观察
ax.set_ylim(2600, 3200)

# 添加辅助线
lc = ax.vlines(df.index.get_loc('2020-01-22'), 2600, 3100, color=colors['灰色'], ls='-')
# 设置线条宽度
lc.set_linewidth(1)
# 文字说明数据来源
ax.text(-3, 2500, '数据来源:AkShare 股票数据。', fontsize=12, color=colors['深灰色'], ha='left')

ax.text(df.index.get_loc('2020-01-22'), 3120, '新冠疫情爆发之后,股市出现了比较大的波动。', fontsize=16, color=colors['深灰色'])

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_color(colors['灰色'])
ax.spines['left'].set_color(colors['灰色'])

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=colors['深灰色'])

plt.show()

帕累托图

在这里插入图片描述
在这里插入图片描述

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x) 

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

# 数据源路径
filepath=r'C:\Users\Administrator\Desktop\帕累托图数据源.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath)

# 定义画图所需的数据
x = df['原因']
y = df['频次']

# 让折线图从坐标原点开始
x2 = np.arange(len(x)+1) - 0.5
# 计算累计频次
y_cumsum = [0] + list(y.cumsum())
# 计算累计百分比
y2 = y.cumsum()/y.sum()

# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 6))

# 设置标题
ax.set_title('\n%.1f%%' % (y_cumsum[2]/y.sum()*100) + '的质量问题是由20%的原因引起的\n', 
             fontsize=26, loc='left', color=c['深灰色'])

# 用灰色方框代表总体的大小,体现每个数据的占比关系
ax.bar(x, y.sum(), width=1, color='w', edgecolor=c['浅灰色'], zorder=0)

# 画柱形图
ax.bar(x, y, width=1, color=c['蓝色'], edgecolor=c['浅灰色'], zorder=1)

# 画折线图
ax.plot(x2, y_cumsum, ls='-', lw=2, color=c['橙色'], label='累计百分比', zorder=2)

# 标记体现二八法则的虚线
ax.hlines(y_cumsum[2], -0.5, 1.5, color=c['橙色'], ls='--')
ax.vlines(1.5, 0, y_cumsum[2], color=c['橙色'], ls='--')

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# 设置图形的位置,减少空白
ax.spines['left'].set_position(('data', -0.51))

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)
ax.tick_params(axis='y', which='major', length=0)
ax.set_yticklabels([])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=c['深灰色'])

# 设置数据标签
for a, a2, b, b2, b3 in zip(x, x2[1:], y, y_cumsum[1:], y2):
    ax.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=16, color=c['蓝色'])
    

# 标记 Y 轴标题
ax.text(-1, y.sum(), '频\n次', fontsize=16, va='top', color=c['蓝色'])

# 标记线条含义
ax.text(1.5, y_cumsum[2]+10, '累计%.1f%% ' % (y_cumsum[2]/y.sum()*100), fontsize=16, color=c['橙色'], va='bottom', ha='right', zorder=5)

plt.show()

雷达图

在这里插入图片描述

瀑布图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

矩阵分析

在这里插入图片描述

子弹图

在这里插入图片描述

# 导入所需的库
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 2.6))
# 设置标题和坐标轴标签
ax.set_title("2020年3月,销售收入超额完成目标\n", fontsize=26, verticalalignment='bottom')
# 定义指标名称
y = '销售收入'
# 背景放在最底层
ax.barh(y, 200, height=0.8, color='#00589F', alpha=0.40, label='差')
ax.barh(y, 50, height=0.8, left=200, color='#00589F', alpha=0.25, label='中')
ax.barh(y, 50, height=0.8, left=250, color='#00589F', alpha=0.1, label='好')
# 隐藏的占位元素,为了让图片留有更多的空白区域
ax.barh(y, 50, height=1, left=250, color='#00589F', alpha=0)
# 实际值
ax.barh(y, 280, height=0.3, color='#00589F', label='实际')
# 目标值
lc = ax.vlines(260, -0.3, 0.3, color='#CC5036', label='目标')
# 设置线条宽度
lc.set_linewidth(3)
# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
# X 轴的刻度线朝内,调整线条的长度,让其贴近条形图
mpl.rcParams['xtick.direction'] = 'in'
ax.tick_params(axis='x', which='major', length=8)
# 隐藏 Y 轴刻度
ax.set_yticks([])
# 设置 X 轴标签
ax.set_xlabel('\n(单位:万元)', fontsize=16)
# 设置坐标标签字体大小
ax.tick_params(labelsize=20)
# 设置图例显示的位置
ax.legend(bbox_to_anchor=(1.15, 1.15))
# 设置字体
font={'family':'SimHei', 'color':'#00589F', 'size':15}
plt.show()
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页