快速且正确的显示中文

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

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

  1. import matplotlib as mpl
  2. WRYH = mpl.font_manager.FontProperties(
  3.     fname=‘/Users/liuzaoqi/Desktop/可视化图鉴/font/WeiRuanYaHei-1.ttf’)
  4. # 微软雅黑字体
  5. plt.title(‘可视化图鉴’, fontproperties=WRYH)

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

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

%title插图%num

提高分辨率

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

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

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

%config InlineBackend.figure_format = 'retina'

%title插图%num

添加数学公式

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

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

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

%title插图%num

一行代码提高颜值

有时我们会觉得matplotlib默认制作出来的图片太朴素了,不够高级,其实开发者也内置了几十种主题让我们自己选择,只要使用plt.style.use(‘主题名’)指定主题即可,具体的支持主题我也整理出来的在《一行代码提高颜值,给你的matplotlib换个样式!》这篇文章中。

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

plt.style.use('ggplot')

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

  1. import seaborn as sns
  2. sns.set_palette(“pastel”8)

%title插图%num%title插图%num

调整图例位置

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

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

%title插图%num%title插图%num

获得当前绘图区域

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

ax = plt.gca()

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

%title插图%num

隐藏坐标轴

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

  1. ax.spines[‘right’].set_color(‘None’)
  2. ax.spines[‘top’].set_color(‘None’)

%title插图%num

  1. ax.spines[‘right’].set_color(‘deeppink’)
  2. ax.spines[‘top’].set_color(‘blue’)
  3. ax.spines[‘bottom’].set_color(‘green’)
  4. ax.spines[‘left’].set_color(‘red’)

%title插图%num%title插图%num

指定坐标轴刻度

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

  1. label = [‘2月7日’,‘3月25日’,‘5月13日’,‘7月2日’,‘8月21日’,’10月10日’,’11月29日’,’12月31日’]
  2. plt.yticks(range(0,400,50), labels=label,rotation = 40,color = ‘black’)

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

plt.yticks([])

%title插图%num

添加自定义图片

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

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

  1. from matplotlib.offsetbox import (OffsetImage,AnnotationBbox)
  2. import matplotlib.image as mpimg
  3. arr_img = mpimg.imread(‘你的图片位置’)

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

  1. imagebox = OffsetImage(arr_img, zoom=0.2)
  2. ab = AnnotationBbox(imagebox, [0.15,0.5],
  3.                     xybox=(170.-50.),
  4.                     xycoords=‘data’,
  5.                     boxcoords=“offset points”,
  6.                     pad=0.5
  7.                     )
  8. ax.add_artist(ab)

%title插图%num

添加表格

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

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

  1. data = [[ 66386174296,  75131577908,  32015],
  2.         [ 58230381139,  78045,  99308160454],
  3.         [ 89135,  80552152558497981603535],
  4.         [ 78415,  81858150656193263,  69638],
  5.         [139361331509343164781380,  52269]]
  6. columns = (‘Freeze’‘Wind’‘Flood’‘Quake’‘Hail’)
  7. rows = [‘%d year’ % x for x in (1005020105)]
  8. values = np.arange(02500500)
  9. value_increment = 1000
  10. colors = plt.cm.BuPu(np.linspace(00.5len(rows)))
  11. n_rows = len(data)
  12. index = np.arange(len(columns)) + 0.3
  13. bar_width = 0.4
  14. plt.figure(figsize = (8,5),dpi =100)
  15. y_offset = np.zeros(len(columns))
  16. cell_text = []
  17. for row in range(n_rows):
  18.     plt.bar(index, data[row], bar_width, bottom=y_offset, color=colors[row])
  19.     y_offset = y_offset + data[row]
  20.     cell_text.append([‘%1.1f’ % (x / 1000.0for x in y_offset])
  21. colors = colors[::-1]
  22. cell_text.reverse()
  23. the_table = plt.table(cellText=cell_text,
  24.                       rowLabels=rows,
  25.                       rowColours=colors,
  26.                       colLabels=columns,
  27.                       loc=‘bottom’
  28.                      ,cellColours=plt.cm.Blues(x))
  29. plt.subplots_adjust(left=0.2, bottom=0.2)
  30. plt.ylabel(“Loss in ${0}’s”.format(value_increment))
  31. plt.yticks(values * value_increment, [‘%d’ % val for val in values])
  32. plt.xticks([])
  33. plt.title(‘Loss by Disaster’)
  34. plt.show()

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

  1. ☞可供货华为!ARM 十年来首次发布*新架构 Armv9☞多出20倍?Android 收集用户数据量远超 iPhone
  2. ☞将 Linux 移植到 M1 Mac 真的太难了!%title插图%num