在使用Python进行数据可视化时,相信不论是什么工具,你都会发现有些操作/代码段会频繁的用到,这一点在matplotlib上尤为突出。
快速且正确的显示中文
在matplotlib中,默认是没法显示中文的,原因很简单,默认使用的字体文件中不含中文。
importmatplotlibasmpl
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,可以在jupyternotebook中,使用下面一行代码有效提高图像画质
%configInlineBackend.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输出,异曲同工,此处不多介绍。
一行代码提高颜值
例如使用R语言中经典的ggplot主题
plt.style.use('ggplot')
另外一种提高图形颜值的代码是借用seaborn调色板修改配色,也是一行代码,通过sns.set_palette(xxxx)就能直接调整全局配色方案,下面是我比较喜欢的一种配色
importseabornassnssns.set_palette("pastel",8)
调整图例位置
虽然matplotlib在生成图例时,默认会选择一个最合适的位置,但是有时依旧不能让人满意。
相信你知道我们可以使用loc=xxxx自己设置图例位置,但是对于xxxx每次都要查,看文字说明左上右下不如一张图来的快,下面是我们可以选择的9个位置,可以根据自己的需要进行选择。
获得当前绘图区域
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也可以独立完成,总共分两步:打开图片——添加图片
frommatplotlib.offsetboximport(OffsetImage,AnnotationBbox)importmatplotlib.imageasmpimgarr_img=mpimg.imread('你的图片位置')
接着就可以根据坐标将图片添加到指定位置,详细的设置可以参考官方文档,下面的代码可以拿走就用,根据效果调整坐标即可
imagebox=OffsetImage(arr_img,zoom=0.2)ab=AnnotationBbox(imagebox,[0.15,0.5],xybox=(170.,-50.),xycoords='data',boxcoords="offsetpoints",pad=0.5ax.add_artist(ab)
添加表格
有时只用图片很难传递更多的信息,幸运的是,在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=['%dyear'%xforxin(100,50,20,10,5)]values=np.arange(0,2500,500)value_increment=1000colors=plt.cm.BuPu(np.linspace(0,0.5,len(rows)))n_rows=len(data)
index=np.arange(len(columns))+0.3bar_width=0.4
plt.figure(figsize=(8,5),dpi=100)y_offset=np.zeros(len(columns))cell_text=[]forrowinrange(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)forxiny_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("Lossin${0}'s".format(value_increment))plt.yticks(values*value_increment,['%d'%valforvalinvalues])plt.xticks([])plt.title('LossbyDisaster')