龙空技术网

数据太多,还在堆一起画折线?你的可视化方法需要升级了

心梗后余生 1353

前言:

如今你们对“python折线图折线混乱”大概比较关怀,你们都想要学习一些“python折线图折线混乱”的相关内容。那么小编也在网络上汇集了一些有关“python折线图折线混乱””的相关内容,希望咱们能喜欢,我们一起来了解一下吧!

在上一篇文章中少即是多!如何在复杂混乱的折线图中突出一条线(附Python代码),介绍了在很多条折线中凸显某一个折线。

本篇不再赘述数据读取和处理部分,可翻看前面的文章了解。

下面老海统一介绍四种方法,实现突出多组折线数据中最重要的那一条数据

其中,小倍图概念来自可视化大师的推荐,主旨是化繁为简,less is more!

方法一:强调突出某条折线

# 画出其他城市的折线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()

方法二:将复杂的多组折线,切分为小倍图

import mathimport matplotlib.dates as mdate# start_time = pd.to_datetime('2015-05-01',format="%Y/%m/%d")# end_time = pd.to_datetime('2015-05-31',format="%Y/%m/%d")n = 2                         # 设置画板切为几行显示,由数据字段个数/行数,来控制列数plt.figure(figsize=(10*n,10)) # 也可控制画板高度 mapnum = 0for i in City_name:    mapnum+=1    plt.subplot(n,math.ceil(len(City_name)/n), mapnum)        # !!按照城市筛选数据,优先画出重点城市的折线    City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==i]          # 画出每个城市的折线    plt.plot(City_data.index,             City_data['购买数量'],             color=colors[mapnum])            # 设置为突出颜色        # 画出每个城市的数据标签,如城市名称    plt.text(City_data.index[-1],             City_data['购买数量'][-1],             i,color=colors[mapnum],          # 设置为突出颜色             fontsize=12)         # !!画出其他城市的所有折线    for j in City_name:        if j != i:                        # 按照城市筛选数据            City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==j]              # 画出每个城市的折线            plt.plot(City_data.index,                     City_data['购买数量'],                     color='grey',            # # 设置为灰色                     alpha=0.3)                        # 画出每个城市的数据标签,如城市名称            plt.text(City_data.index[-1],                     City_data['购买数量'][-1],                     j,color='grey',fontsize=12)          # 设置为灰色            #     -------------------------------------------------------------------------------------------#     plt.xlim(start_time,end_time)                          # 如果为数值型坐标轴可以设置相同的区间#     plt.ylim(0,Sales_data_sum['购买数量'].max())            # 设置Y轴的取值范围#     以上两行在这里不用使用,因为X轴为时间型数据比较特殊,Y轴的刻度间隔过大,需要调整#     -------------------------------------------------------------------------------------------    # 横轴为时间坐标,同时设置刻度间隔大小,此处非常关键,一般都是同一时间段内的对比    ax = plt.gca()                                                               #表明设置图片的各个轴,plt.gcf()表示图片本身    ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))                # 设置横坐标标签显示的日期格式    plt.xticks(pd.date_range('2015-05-01','2015-05-31',freq='10d'),fontsize=10)  # 设置刻度范围以及间隔大小     plt.yticks(np.arange(0,Sales_data_sum['购买数量'].max(),step=2),fontsize=10)        # 为了更加美化,对各个子图的边框进行统一处理,全部去掉,包括上下左右边框    for key, spine in ax.spines.items():        spine.set_visible(False)                  # 去除所有的边框,效果更好!        #    --------------------------------------------------------------        #     当然可以进行选择了的去除某个边框,以下为去除某个或者某几个时的代码#     'left', 'right', 'bottom', 'top'#         if key == 'right' or key == 'top':#             spine.set_visible(False)#     --------------------------------------------------------------    # 为了更加美化,还需要去掉X,Y轴的刻度线    plt.tick_params(bottom=False)       # 去除底部的刻度线    plt.tick_params(left=False)         # 去除左边的刻度线        # 为了更加美化,还需求去掉非边缘的子图的刻度标签,仅保留最左边和最底部的标签    if mapnum in range(1,4) :        plt.tick_params(labelbottom=False)    # 去掉X轴的刻度标签    if mapnum not in [1,4] :        plt.tick_params(labelleft=False)      # 去掉Y轴的刻度标签            # 设置每个子图的小标题    plt.title(i,               loc='center',               fontsize=12,               fontweight=0,               color=colors[mapnum])# 设置整个画板的标题plt.suptitle("各个城市5月份销售数量情况", fontsize=40,horizontalalignment='right', color='black')# 统一调整子图间的行间距和列间距plt.subplots_adjust(wspace =0.5, hspace =0.5)# 设置坐标轴名称,注意这里是在画布插入坐标标题文字,这个位置是画布的相对比例一般是0-1之间!plt.figtext(0.5,0.05, '时间', ha='center', va='center')plt.figtext(0.1,0.5, '购买数量', ha='center', va='center', rotation='vertical')# sns.despine() # 默认无参数状态,就是删除上方和右方的边框,matplotlib貌似做不到plt.show()

方法三:利用颜色强调 + “小倍图”模式

import mathimport matplotlib.dates as mdate# start_time = pd.to_datetime('2015-05-01',format="%Y/%m/%d")# end_time = pd.to_datetime('2015-05-31',format="%Y/%m/%d")n = 2                         # 设置画板切为几行显示,由数据字段个数/行数,来控制列数plt.figure(figsize=(10*n,10)) # 也可控制画板高度 mapnum = 0for i in City_name:    mapnum+=1    plt.subplot(n,math.ceil(len(City_name)/n), mapnum)        # !!按照城市筛选数据,优先画出重点城市的折线    City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==i]          # 画出每个城市的折线    plt.plot(City_data.index,             City_data['购买数量'],             color=colors[mapnum])            # 设置为突出颜色        # 画出每个城市的数据标签,如城市名称    plt.text(City_data.index[-1],             City_data['购买数量'][-1],             i,color=colors[mapnum],          # 设置为突出颜色             fontsize=12)         # !!画出其他城市的所有折线    for j in City_name:        if j != i:                        # 按照城市筛选数据            City_data = Sales_data_sum.loc[Sales_data_sum['门店城市']==j]              # 画出每个城市的折线            plt.plot(City_data.index,                     City_data['购买数量'],                     color='grey',            # # 设置为灰色                     alpha=0.3)                        # 画出每个城市的数据标签,如城市名称            plt.text(City_data.index[-1],                     City_data['购买数量'][-1],                     j,color='grey',fontsize=12)          # 设置为灰色            #     -------------------------------------------------------------------------------------------#     plt.xlim(start_time,end_time)                          # 如果为数值型坐标轴可以设置相同的区间#     plt.ylim(0,Sales_data_sum['购买数量'].max())            # 设置Y轴的取值范围#     以上两行在这里不用使用,因为X轴为时间型数据比较特殊,Y轴的刻度间隔过大,需要调整#     -------------------------------------------------------------------------------------------    # 横轴为时间坐标,同时设置刻度间隔大小,此处非常关键,一般都是同一时间段内的对比    ax = plt.gca()                                                               #表明设置图片的各个轴,plt.gcf()表示图片本身    ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))                # 设置横坐标标签显示的日期格式    plt.xticks(pd.date_range('2015-05-01','2015-05-31',freq='10d'),fontsize=10)  # 设置刻度范围以及间隔大小     plt.yticks(np.arange(0,Sales_data_sum['购买数量'].max(),step=2),fontsize=10)        # 为了更加美化,对各个子图的边框进行统一处理,全部去掉,包括上下左右边框    for key, spine in ax.spines.items():        spine.set_visible(False)                  # 去除所有的边框,效果更好!        #    --------------------------------------------------------------        #     当然可以进行选择了的去除某个边框,以下为去除某个或者某几个时的代码#     'left', 'right', 'bottom', 'top'#         if key == 'right' or key == 'top':#             spine.set_visible(False)#     --------------------------------------------------------------    # 为了更加美化,还需要去掉X,Y轴的刻度线    plt.tick_params(bottom=False)       # 去除底部的刻度线    plt.tick_params(left=False)         # 去除左边的刻度线        # 为了更加美化,还需求去掉非边缘的子图的刻度标签,仅保留最左边和最底部的标签    if mapnum in range(1,4) :        plt.tick_params(labelbottom=False)    # 去掉X轴的刻度标签    if mapnum not in [1,4] :        plt.tick_params(labelleft=False)      # 去掉Y轴的刻度标签            # 设置每个子图的小标题    plt.title(i,               loc='center',               fontsize=12,               fontweight=0,               color=colors[mapnum])# 设置整个画板的标题plt.suptitle("各个城市5月份销售数量情况", fontsize=40,horizontalalignment='right', color='black')# 统一调整子图间的行间距和列间距plt.subplots_adjust(wspace =0.5, hspace =0.5)# 设置坐标轴名称,注意这里是在画布插入坐标标题文字,这个位置是画布的相对比例一般是0-1之间!plt.figtext(0.5,0.05, '时间', ha='center', va='center')plt.figtext(0.1,0.5, '购买数量', ha='center', va='center', rotation='vertical')# sns.despine() # 默认无参数状态,就是删除上方和右方的边框,matplotlib貌似做不到plt.show()

方法四:折线面积图 + 小倍图模式

# ------------由于X轴为时间序列,个数太多,此处单独设置一下字体大小来美化展示plt.rcParams['font.sans-serif']=['Source Han Sans CN']      # 显示中文不乱码,思源黑体 plt.rcParams['font.size'] = 10                              # 设置图表全局字体大小,后期某个元素的字体大小可以自行调整plt.rcParams['xtick.labelsize'] = 5                         # 设置图表X轴全局字体大小,此处单独设置因为是时间序列plt.rcParams['axes.unicode_minus'] = False                  # 显示负数不乱码# ------------------------------------------------------------------------------n = 2                         # 设置画板切为几行显示,由数据字段个数/行数,来控制列数# 创建不同城市的面积图切片City_chart = sns.FacetGrid(Sales_data_new, col='门店城市', hue='门店城市', col_wrap=math.ceil(len(City_name)/n)) # 通过折线功能,画出折线图效果,此时与多折线小倍图效果一致City_chart.map(plt.plot, '订单日期', '购买数量')# 通过填充方法,画出面积填充颜色,此时完成类似面积图效果City_chart.map(plt.fill_between, '订单日期', '购买数量', alpha=0.2) # 给每个图添加名称  City_chart.set_titles("{col_name}")                                                # 设置各个子图的标题# 设置子图的刻度范围及间隔,以及刻度的显示范围,以及刻度标签的大小。注意!如果使用SNS默认风格,这些都不用操作# City_chart.set_xticklabels(fontsize=5)                                             # 设置X轴标签大小# City_chart.set_yticklabels(fontsize=5)                                             # 设置Y轴标签大小City_chart.set(xticks=(pd.date_range('2015-05-01','2015-05-31',freq='10d')))       # 设置各个子图的X轴刻度范围及间隔City_chart.set(yticks=(np.arange(0,Sales_data_new['购买数量'].max(),step=2)))       # 设置各个子图的Y轴刻度范围及间隔City_chart.set(xlim=(pd.to_datetime('2015-05-01',format="%Y/%m/%d"),                     pd.to_datetime('2015-06-02',format="%Y/%m/%d")))              # 设置X轴的显示范围City_chart.set(ylim=(0,Sales_data_new['购买数量'].max()))                           # 设置Y轴的显示范围# 设置边框,把边框取消sns.despine(top=True, right=True, left=True, bottom=True)# 设置刻度线,把刻度线取消ax = City_chart.fig.get_axes()for i in ax:    i.tick_params(bottom=False)    i.tick_params(left=False)# 设置标题与图表的间隔,以及子图之间的间隔City_chart.fig.subplots_adjust(top=0.85,wspace=.2,hspace=.2)                                #子图和子图之间的间隔设置# 给整个画板添加一个标题City_chart.fig.suptitle("各个城市5月份销售数量情况")plt.show()

写在最后

以上方法,利用PYTHON完成,代码量不小。老海已经想办法优化了,可惜还是不少。

建议我们利用突出 + 切分的核心思路,来设计图表展示,而不要局限于何种工具。

OK,今天先到这里了,以上为本文全部内容,如果觉得喜欢,请动动小手转发和关注一下我们。

我是老海,来自数据炼金术师

标签: #python折线图折线混乱