9

精心总结了10个matplotlib绘图技巧,短小精悍,威力无穷!

 3 years ago
source link: https://www.techug.com/post/meticulously-summed-up-10-matplotlib-drawing-skills-short-and-powerful.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是早起。

在使用 Python 进行数据可视化时,相信不论是什么工具,你都会发现有些操作/代码段会频繁的用到,这一点在matplotlib上尤为突出。

本文就向大家分享十个我常用的一些小技巧,大多一行代码,短小精悍,威力无穷

一、快速且正确的显示中文

matplotlib中,默认是没法显示中文的,原因很简单,默认使用的字体文件中不含中文。

当你搜索如何设置中文时,会有很多教程,我曾经也详细的介绍过3种方法,但是在有的电脑上折腾很久也搞不定,所以当你浪费了太多时间也没法解决,或者在一台陌生的设备上使用,需要快速的让matplotlib显示中文可以使用下面的代码

import matplotlib as mpl

WRYH = mpl.font_manager.FontProperties(
    fname='/Users/liuzaoqi/Desktop/可视化图鉴/font/WeiRuanYaHei-1.ttf')  
# 微软雅黑字体

plt.title('可视化图鉴', fontproperties=WRYH)

很简单,既然修改默认的字体搞不定,那么就准备一个中文字体的路径,并在每次需要显示中文的组件(标题、注释、图例等)时,就强制指定使用这个字体。

这个办法一定可以让你图中的中文快速且正确显示出来,但是如果涉及中文的地方过多,还是需要在以后尝试一劳永逸的将中文字体添加到默认字体集中。

二、提高分辨率

如果感觉默认生成的图形分辨率不够高,可以尝试修改 dpi 来提高分辨率,在matplotlib中可以一次性通过plt.rcParams修改,也可以在创建画布时为这一次的绘制修改,例如将分辨率调整至100

plt.figure(figsize = (7,6),dpi =100)

如果你的设备是配备Retina屏幕的mac,可以在jupyter notebook中,使用下面一行代码有效提高图像画质

%config InlineBackend.figure_format = 'retina'

三、添加数学公式

有时我们在绘图时需要添加带有数学符号、公式的文字,如果直接使用默认的方法添加,虽然可以实现,但是不够美观,其实在matplotlib中也支持输出数学公式,就像下面的文字注释一样

只用在需要出现公式的位置使用r’你的公式’即可,比如plt.text(11000,0.45,r'拟合的曲线为$f(x) = 1.3x^2-6.54x+0.5$')注意$$中是latex格式的表达方式,如果不熟悉的话需要自行搜索。

当然,也可以使用plt.rcParams['text.usetex'] = True设置默认tex输出,异曲同工,此处不多介绍。

四、一行代码提高颜值

有时我们会觉得matplotlib默认制作出来的图片太朴素了,不够高级,其实开发者也内置了几十种主题让我们自己选择,只要使用plt.style.use('主题名')指定主题即可,具体的支持主题我也整理出来的在这篇文章中,大家可以点击本文字查看

例如使用R语言中经典的ggplot主题

plt.style.use('ggplot')


另外一种提高图形颜值的代码是借用seaborn调色板修改配色,也是一行代码,通过sns.set_palette(xxxx)就能直接调整全局配色方案,下面是我比较喜欢的一种配色

import seaborn as sns
sns.set_palette("pastel", 8)


五、调整图例位置

虽然matplotlib在生成图例时,默认会选择一个最合适的位置,但是有时依旧不能让人满意。

相信你知道我们可以使用loc = xxxx自己设置图例位置,但是对于xxxx每次都要查,看文字说明左上右下不如一张图来的快,下面是我们可以选择的9个位置,可以根据自己的需要进行选择。

六、获得当前绘图区域

在原理篇文章中,我曾经说到如果想要获得更精细的调整,就需要使用ax.xxxx进行调整,但有时我们开始没有使用fig,ax=plt.subplots(figsize = (6,4),dpi=100)来定义ax,在需要使用时重新开始并定义是不推荐的,这时可以使用

ax = plt.gca()

获得当前Figure中的Axes,并继续正常使用ax.xxxx调整

七、隐藏坐标轴

对于有些图形我们希望通过隐藏坐标轴来显得更加美观,这时可以ax.spines获取对应位置的的Spine对象,之后便可以任意修改是否显示与显示颜色,比如让右边和上面的线消失或者修改颜色

ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')


ax.spines['right'].set_color('deeppink')
ax.spines['top'].set_color('blue')
ax.spines['bottom'].set_color('green')
ax.spines['left'].set_color('red')


八、指定坐标轴刻度

如果对于默认生成的坐标轴刻度不满意,我们可以使用plt.yticks([])来自定义刻度,注意需要传入一个你想要的刻度list,并且长度需要和刻度对应,例如下方代码

label = ['2月7日','3月25日','5月13日','7月2日','8月21日','10月10日','11月29日','12月31日']

plt.yticks(range(0,400,50), labels=label,rotation = 40,color = 'black')


当然如果label是空的话,可以结合上一个技巧把对应的坐标轴干掉,彻底消失

plt.yticks([])

九、添加自定义图片

有时我们希望在对数据可视化后添加一些图片来丰富元素,虽然可以使用ps添加,但其实matplotlib也可以独立完成,总共分两步:打开图片——添加图片

首先导入相关的包并根据图片路径导入

from matplotlib.offsetbox import (OffsetImage,AnnotationBbox)
import matplotlib.image as mpimg
arr_img = mpimg.imread('你的图片位置')

接着就可以根据坐标将图片添加到指定位置,详细的设置可以参考官方文档,下面的代码可以拿走就用,根据效果调整坐标即可

imagebox = OffsetImage(arr_img, zoom=0.2)
ab = AnnotationBbox(imagebox, [0.15,0.5],
                    xybox=(170., -50.),
                    xycoords='data',
                    boxcoords="offset points",
                    pad=0.5
                    )
ax.add_artist(ab)

比如添加我的公众号logo,再辅以一些指示性的文字,都是非常简单的👇

十、添加表格

有时只用图片很难传递更多的信息,幸运的是,在matplotlib中也可以使用plt.table来为图片添加一张与之对应的表格,只需要将你的数据按照指定格式传入即可。

下面是我在官方文档示例的基础上,添加渐变效果的表格

data = [[ 66386, 174296,  75131, 577908,  32015],
        [ 58230, 381139,  78045,  99308, 160454],
        [ 89135,  80552, 152558, 497981, 603535],
        [ 78415,  81858, 150656, 193263,  69638],
        [139361, 331509, 343164, 781380,  52269]]

columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
values = np.arange(0, 2500, 500)
value_increment = 1000
colors = plt.cm.BuPu(np.linspace(0, 0.5, len(rows)))
n_rows = len(data)

index = np.arange(len(columns)) + 0.3
bar_width = 0.4

plt.figure(figsize = (8,5),dpi =100)
y_offset = np.zeros(len(columns))
cell_text = []
for row in range(n_rows):
    plt.bar(index, data[row], bar_width, bottom=y_offset, color=colors[row])
    y_offset = y_offset + data[row]
    cell_text.append(['%1.1f' % (x / 1000.0) for x in y_offset])
colors = colors[::-1]
cell_text.reverse()

the_table = plt.table(cellText=cell_text,
                      rowLabels=rows,
                      rowColours=colors,
                      colLabels=columns,
                      loc='bottom'
                     ,cellColours=plt.cm.Blues(x))

plt.subplots_adjust(left=0.2, bottom=0.2)

plt.ylabel("Loss in ${0}'s".format(value_increment))
plt.yticks(values * value_increment, ['%d' % val for val in values])
plt.xticks([])
plt.title('Loss by Disaster')

plt.show()


以上就是本文和大家总结的10个matplotlib小技巧,在未来的文章中我会继续分享相关知识,也希望大家可以在使用一些数据可视化工具时可以不断总结,不断进步。

-END-


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK