少即是多!如何在复杂混乱的折线图中突出一条线(附Python代码)

在上文Python数据可视化实例:关于图表“贵族”折线的增强优化方法中,我们总结了很多关于折线图的方法和注意事项,有兴趣的可以回头翻看一下。

越是想展示更多,越是容易混乱

在前面的注意事项里,我们提到有一项叫做“意大利面条图”,来形容多条折线在一组图里的混乱情况。

N多条折线错综复杂、交叉在一起,根本分不清哪个是重点、哪里有异常。

在实际业务中,很多时候都会遇到这种图表,比如不同城市在同一个时间内的业务变化情况


LOSS IS MOER:少即是多,突出重点

其实业务讲究解决问题,图表的数据自然也应该直接瞄准重点。而不是把所有的数据都堆砌到一张图表里。越是简单直接,越是能加速解读数据,也能提高商业效率。

下面我们来做一组实验:

这是一张图满是汽车的图片,你第一眼看到它,会先注意或者关注到哪辆车?

OK,再来看看这张图片,你的注意力会集中到哪里?

结论不言而喻,第二张图留给我们的印象更深刻,更容易吸引我们的注意力。

甚至我们会产生兴趣,想知道这辆车到底跑的多快,什么品牌等等。

这也正是因为我们眼睛和注意力的承载力有限,比如看股市图表,一般人是受不了这些密密麻麻的。

所以我们更喜欢简单明了的东西,它理解起来更快,当然也容易被忽悠和利用。



同样的道理,就是文章→图表→长视频→短视频→大标题,越是简单直接,越是惹人关注!

看看图表中如何解决“意大利面条图”

OK,下面我们来看看如何利用这个原则来解决杂乱图表的问题

数据为模拟数据,主要是为了演示效果,没有具体商业意义。


准备工作

import pandas as pd 
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 引入pandas、matplotlib、seaborn包
import sys
# 引入系统模块库
import os
# 引入文件/目录方法库

print(sys.version)
print('------------')
print(pd.__version__)

## 初始字体设置,设置好可避免很多麻烦
plt.rcParams['font.sans-serif']=['Source Han Sans CN']      # 显示中文不乱码,思源黑体 
plt.rcParams['font.size'] = 22                              # 设置图表全局字体大小,后期某个元素的字体大小可以自行调整
plt.rcParams['axes.unicode_minus'] = False                  # 显示负数不乱码
## 初始化图表大小
plt.rcParams['figure.figsize'] = (20.0, 8.0)                # 设置figure_size尺寸
## 初始化图表分辨率质量
plt.rcParams['savefig.dpi'] = 300                           # 设置图表保存时的像素分辨率
plt.rcParams['figure.dpi'] = 300                            # 设置图表绘制时的像素分辨率

## 图表的颜色自定义
colors = ['#dc2624', '#2b4750', '#45a0a2', '#e87a59',
         '#7dcaa9', '#649E7D', '#dc8018', '#C89F91', 
         '#6c6d6c', '#4f6268', '#c7cccf']
plt.rcParams['axes.prop_cycle'] = plt.cycler( color=colors)


path = 'D:\\系列文章\\'
# 自定义文件路径,可以自行设定
os.chdir(path)
# 设置为该路径为工作路径,一般存放数据源文件

Sales_data = pd.read_excel('虚拟演示案例数据.xlsx',
                           sheet_name='销售数据表')

数据处理和转化


Sales_data = pd.read_excel('虚拟演示案例数据.xlsx',
                           sheet_name='销售数据表')

Sales_data_sum = Sales_data_sum['2015-05-01':'2015-05-30']
Sales_data_sum

City_name = Sales_data_sum['门店城市'].unique().tolist()
One_City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']=='北京市']
One_City_data

画出折线图,并突出显示北京的数据


# 画出其他城市的折线
for i in City_name[1:6]:
    
    # 按照城市筛选数据
    City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==i]  
    
    # 画出每个城市的折线
    plt.plot(City_data.index,
             City_data['购买数量'],
             color='grey')            # 设置为灰色
    
    # 画出每个城市的数据标签,如城市名称
    plt.text(City_data.index[-1],
             City_data['购买数量'][-1],
             i,color='grey')          # 设置为灰色
    

# 画出重点突出的折线
One_City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==City_name[0]] # 本案例具体是指北京
plt.plot(One_City_data.index,
         One_City_data['购买数量'],
         color='orange', 
         linewidth=4,
         alpha=0.7)
plt.text(One_City_data.index[0],
         One_City_data['购买数量'][0],
         City_name[0],
         color='orange')

# 设置图表的其他元素
plt.title("北京5月份销量变化情况", 
          loc='left', 
          fontsize=30, 
          fontweight=0, 
          color='orange') # 设置图表标题
plt.xlabel("时间")        # 设置X轴坐标名称
plt.ylabel("购买数量")    # 设置Y轴坐标名称

sns.despine() # 默认无参数状态,就是删除上方和右方的边框,matplotlib貌似做不到
plt.show()

写在最后

以上代码中,附加了注释内容。如果不清楚Python语法,建议自学一下。

另外其实这个功能在Excel中只需动动手指修改线条颜色,比起写代码省时间。

喜欢本篇内容,请动动小手转发和关注一下,我是数据分析师,老海。

举报
评论 0