自动美化你的Matplotlib ,使用Seaborn控制图表的默认值

   日期:2020-06-01     浏览:148    评论:0    
核心提示:如果您曾经在 Python 中进行过数据可视化,那么很可能您使用了 Matplotlib 库。这个库包含了许多绘图的功能。但是一些概念上简单的可视化需要大量的代码才能完成。而在这个时代,人们希望能够与图表进行交互——这是普通 Matplotlib 库无法提供的功能。更重要的是,采用默认设置的 Matplotlib 图表通常看起来很糟糕。当然,默认的 Matplotlib 设置能够使得您的可视化视觉效果看起来十分朴素,但是显然是有点过时的。它默认的蓝色阴影通常难以满足许多数据科学家的需求。采取.python

如果您曾经在 Python 中进行过数据可视化,那么很可能您使用了 Matplotlib 库。
这个库包含了许多绘图的功能。但是一些概念上简单的可视化需要大量的代码才能完成。
而在这个时代,人们希望能够与图表进行交互——这是普通 Matplotlib 库无法提供的功能。
更重要的是,采用默认设置的 Matplotlib 图表通常看起来很糟糕。

当然,默认的 Matplotlib 设置能够使得您的可视化视觉效果看起来十分朴素,但是显然是有点过时的。
它默认的蓝色阴影通常难以满足许多数据科学家的需求。


采取默认设置的柱状图


稍加调整的柱状图

同时,Matplotlib 的一个不足之处在于它的可定制性。
您可以创建非常复杂的视觉效果,但是不可否认,实现复杂的视觉效果需要很多行代码,而大部分数据科学家很少有太多时间用于这一方面。

不想每个 plot 都有那个烦人的边框吗?
想使用您品牌的调色板而不必每次都指定十六进制代码吗?
要对所有图表标签使用 Comic Sans 字体吗?
寻求专业库的帮助吧。

颜色设置

Matplotlib 中有自带的颜色系统(例如广为人知的“bisque”、“lavenderblush” 和 “lightgoldenrodyellow”),绘图时可以通过十六进制代码的形式设置颜色。
可以很方便地自定义调色板。
例如, CB91 字体的背景通过一组预定义的颜色代码进行设置。

上图使用到的颜色代码有:

CB91_Blue = '#2CBDFE'
CB91_Green = '#47DBCD'
CB91_Pink = '#F3A0F2'
CB91_Purple = '#9D2EC5'
CB91_Violet = '#661D98'
CB91_Amber = '#F5B14C'

如果你想创建自己的调色板,有一些有用的工具可以在线帮助。比如 Colormind.io通过深度学习从照片、电影和流行艺术中学习色彩风格,因此色调搭配得很好。

通过上述代码定义了颜色集,就可以将其声明为一个颜色列表,然后更改 Matplotlib 的颜色库 cycler

color_list = [CB91_Blue, CB91_Pink, CB91_Green, CB91_Amber, CB91_Purple, CB91_Violet]
plt.rcParams['axes.prop_cycle'] = plt.cycler(color=color_list)

现在,就成功替换了 Matplotlib 绘图所需的默认颜色库,当新建一个多系列绘图时,将会在 cycler 中按顺序进行检索并设置各个系列的颜色。

您还可以使用十六进制颜色列表定义渐变颜色,但是需要在列表中定义许多十六进制值(至少40个)。手动创建这么长的列表可能会很麻烦,这里我建议使用colordesigner.io自动生成所需列表(只需选择要渐变的颜色,最大化渐变步数,然后从生成的HTML中提取十六进制代码)。

如下代码展示了我使用的一个十六进制颜色列表(介于蓝色和紫色):

#A list of hex colours running between blue and purple
CB91_Grad_BP = ['#2cbdfe', '#2fb9fc', '#33b4fa', '#36b0f8',
                '#3aacf6', '#3da8f4', '#41a3f2', '#449ff0',
                '#489bee', '#4b97ec', '#4f92ea', '#528ee8',
                '#568ae6', '#5986e4', '#5c81e2', '#607de0',
                '#6379de', '#6775dc', '#6a70da', '#6e6cd8',
                '#7168d7', '#7564d5', '#785fd3', '#7c5bd1',
                '#7f57cf', '#8353cd', '#864ecb', '#894ac9',
                '#8d46c7', '#9042c5', '#943dc3', '#9739c1',
                '#9b35bf', '#9e31bd', '#a22cbb', '#a528b9',
                '#a924b7', '#ac20b5', '#b01bb3', '#b317b1']

坐标轴调整

Seaborn 是一个以 Matplotlib 为基础的库,可以通过一两行代码创建更复杂的图表类型(如 Heatmaps、Violins 和 Joint Plots)。


通过 Seaborn 生成的 heatmap

Seaborn 的一个鲜为人知的特性是它能够使用.set方法控制 Matplotlib 默认值设置(改变颜色、坐标轴和默认字体)。我们还可以使用 .set_context()方法调整字体大小设置。

详细资料可以查看官方教程。下面是一个简单的例子:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font=’Franklin Gothic Book’,
        rc={
 ‘axes.axisbelow’: False,
 ‘axes.edgecolor’: ‘lightgrey’,
 ‘axes.facecolor’:None,
 ‘axes.grid’: False,
 ‘axes.labelcolor’: ‘dimgrey’,
 ‘axes.spines.right’: False,
 ‘axes.spines.top’: False,
 ‘figure.facecolor’: ‘white’,
 ‘lines.solid_capstyle’:round,
 ‘patch.edgecolor’: ‘w’,
 ‘patch.force_edgecolor’: True,
 ‘text.color’: ‘dimgrey’,
 ‘xtick.bottom’: False,
 ‘xtick.color’: ‘dimgrey’,
 ‘xtick.direction’: ‘out’,
 ‘xtick.top’: False,
 ‘ytick.color’: ‘dimgrey’,
 ‘ytick.direction’: ‘out’,
 ‘ytick.left’: False,
 ‘ytick.right’: False})
sns.set_context("notebook", rc={"font.size":16,
                                "axes.titlesize":20,
                                "axes.labelsize":18})

定义自己的默认设置文件

每次都将前文所提及的所有设置代码写在 Jupyter notebook 前面,会显得整个代码不够简洁。这一点在需要涉及众多十六进制颜色声明时尤其明显。并且也不利于在多个 notebook 中重复使用。

因此,将相关代码统一集成到一个代码文件里,然后在需要时对其进行调用,是一个十分有效的方法。
这样每次编写代码时,只需要在开始部分引入该 .py 文件即可。

Bring in data visualisation libraries as usual
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#Bring in our custom settings
#Assumes that cb91visuals.py is in the repo's root folder
from cb91visuals import *

其它技巧

除了颜色、坐标轴、字体设置外,Matplotlib/Seaborn 还可以对以下内容进行设置。

  • 图例框:图例周围的小框通常是不必要的,并且增加了视觉上的混乱。可通过以下方式关闭:
plt.legend(frameon=False)
  • 删除坐标轴:有时我们想删除一个轴,这可以通过 Seaborn 的 destine 方法完成(根据需要指定左、右、上或下):
sns.despine(left=True, bottom=True)
  • 柱状图上的数字标签:这是软件包中真正应该提供的功能,您可以使用 for looping 和 Matplotlib 的 .text()方法将数字标签添加到柱状图列的顶部。
#Here, 'labels' refers to the bigrams on the y-axis
#i.e. 'Look forward', 'Jó éjt', etc.
#and X is the list of values determining bar length
#Loop through these labels
for n, i in enumerate(labels):
    #Create an axis text object
    ax.text(X[n]-0.003, #X location of text (with adjustment)
            n, #Y location
            s=f'{round(X[n],3)}%', #Required label with formatting
            va='center', #Vertical alignment
            ha='right', #Horizontal alignment
            color='white', #Font colour and size
            fontsize=12)

通过上述代码实现了在水平柱状图上添加数字标签。


作者:Callum Ballard
deephub翻译组:Oliver Lee

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服