导读 /

我们经常面临在画图时的文字标注,本文从图片、坐标轴、坐标值等层面讲起,对matplotlib的文字绘图功能进行总结说明。

Figure和Axes上的文本

Matplotlib具有广泛的文本支持,包括对数学表达式的支持、对栅格和矢量输出的TrueType支持、具有任意旋转的换行分隔文本以及Unicode支持。

下面通过text,figures,axes,suptitle等案例进行学习。

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontPropertiesimport numpy as np
#fontdict学习的案例#学习的过程中请尝试更换不同的fontdict字典的内容,以便于更好的掌握#---------设置字体样式,分别是字体,颜色,宽度,大小font1 = {'family': 'SimSun',#华文楷体         'alpha':0.7,#透明度        'color':  'purple',        'weight': 'normal',        'size': 16,        }font2 = {'family': 'Times New Roman',        'color':  'red',        'weight': 'normal',        'size': 16,        }font3 = {'family': 'serif',        'color':  'blue',        'weight': 'bold',        'size': 14,        }font4 = {'family': 'Calibri',        'color':  'navy',        'weight': 'normal',        'size': 17,        }#-----------四种不同字体显示风格-----#-------建立函数----------x = np.linspace(0.0, 5.0, 100)y = np.cos(2*np.pi*x) * np.exp(-x/3)#-------绘制图像,添加标注----------plt.plot(x, y, '--')plt.title('震荡曲线', fontdict=font1)#------添加文本在指定的坐标处------------plt.text(2, 0.65, r'$\cos(2 \pi x) \exp(-x/3)$', fontdict=font2)#---------设置坐标标签plt.xlabel('Y=time (s)', fontdict=font3)plt.ylabel('X=voltage(mv)', fontdict=font4)# 调整图像边距plt.subplots_adjust(left=0.15)plt.show()

可以看到对图片的横纵坐标进行字体颜色、格式、大小进行了设置。值得注意的是图片中公式的插入。大家平时在写论文时,大多涉及复杂的公式,对于Word爱好者来说,一般采用墨迹公式,这里可以学习Python写入,还可以通过博客的数学公式编辑和Latex。

#文本属性的输入一种是通过**kwargs属性这种方式,一种是通过操作 matplotlib.font_manager.FontProperties 方法#该案例中对于x_label采用**kwargs调整字体属性,y_label则采用 matplotlib.font_manager.FontProperties 方法调整字体属性#该链接是FontProperties方法的介绍 https://matplotlib.org/api/font_manager_api.html#matplotlib.font_manager.FontPropertiesx1 = np.linspace(0.0, 5.0, 100)y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)font = FontProperties()font.set_family('serif')font.set_name('Times New Roman')font.set_style('italic')fig, ax = plt.subplots(figsize=(5, 3))fig.subplots_adjust(bottom=0.15, left=0.2)ax.plot(x1, y1)ax.set_xlabel('time [s]', fontsize='large', fontweight='bold')ax.set_ylabel('Damped oscillation [V]', fontproperties=font)plt.show()

这里是对坐标进行设置,以及调整标题的位置。此外,这里引用了font = FontProperties(),该参数是可选参数,如果该参数被指定,字体的大小将从该参数的默认值中提取。这里贴出官方介绍文档:

https://matplotlib.org/api/font_manager_api.html#matplotlib.font_manager.FontProperties

import matplotlib.pyplot as pltdef demo_con_style(ax, connectionstyle):    x1, y1 = 0.3, 0.2    x2, y2 = 0.8, 0.6    ax.plot([x1, x2], [y1, y2], ".")    ax.annotate("",                xy=(x1, y1), xycoords='data',                xytext=(x2, y2), textcoords='data',                arrowprops=dict(arrowstyle="->", color="0.5",                                shrinkA=5, shrinkB=5,                                patchA=None, patchB=None,                                connectionstyle=connectionstyle,                                ),                )    ax.text(.05, .95, connectionstyle.replace(",", ",\n"),            transform=ax.transAxes, ha="left", va="top")
fig, axs = plt.subplots(3, 5, figsize=(8, 4.8))demo_con_style(axs[0, 0], "angle3,angleA=90,angleB=0")demo_con_style(axs[1, 0], "angle3,angleA=0,angleB=90")demo_con_style(axs[0, 1], "arc3,rad=0.")demo_con_style(axs[1, 1], "arc3,rad=0.3")demo_con_style(axs[2, 1], "arc3,rad=-0.3")demo_con_style(axs[0, 2], "angle,angleA=-90,angleB=180,rad=0")demo_con_style(axs[1, 2], "angle,angleA=-90,angleB=180,rad=5")demo_con_style(axs[2, 2], "angle,angleA=-90,angleB=10,rad=5")demo_con_style(axs[0, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=0")demo_con_style(axs[1, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=5")demo_con_style(axs[2, 3], "arc,angleA=-90,angleB=0,armA=0,armB=40,rad=0")demo_con_style(axs[0, 4], "bar,fraction=0.3")demo_con_style(axs[1, 4], "bar,fraction=-0.3")demo_con_style(axs[2, 4], "bar,angle=180,fraction=-0.2")for ax in axs.flat:    ax.set(xlim=(0, 1), ylim=(0, 1), xticks=[], yticks=[], aspect=1)fig.tight_layout(pad=0.2)plt.show()

相比于前面的图片,上面的这张在科研中见的很少,在这里贴出代码,后续有需要再过来复读。

import numpy as npimport matplotlib.pyplot as plt# 以步长0.005绘制一个曲线x = np.arange(0, 10, 0.005)y = np.exp(-x/2.) * np.sin(2*np.pi*x)fig, ax = plt.subplots()ax.plot(x, y)ax.set_xlim(0, 10)#设置x轴的范围ax.set_ylim(-1, 1)#设置x轴的范围# 被注释点的数据轴坐标和所在的像素xdata, ydata = 5, 0xdisplay, ydisplay = ax.transData.transform_point((xdata, ydata))# 设置注释文本的样式和箭头的样式bbox = dict(boxstyle="round", fc="0.8")arrowprops = dict(    arrowstyle = "->",    connectionstyle = "angle,angleA=0,angleB=90,rad=10")# 设置偏移量offset = 72# xycoords默认为'data'数据轴坐标,对坐标点(5,0)添加注释# 注释文本参考被注释点设置偏移量,向左2*72points,向上72pointsax.annotate('data = (%.1f, %.1f)'%(xdata, ydata),            (xdata, ydata), xytext=(-2*offset, offset), textcoords='offset points',            bbox=bbox, arrowprops=arrowprops)# xycoords以绘图区左下角为参考,单位为像素# 注释文本参考被注释点设置偏移量,向右0.5*72points,向下72pointsdisp = ax.annotate('display = (%.1f, %.1f)'%(xdisplay, ydisplay),            (xdisplay, ydisplay), xytext=(0.5*offset, -offset),            xycoords='figure pixels',            textcoords='offset points',            bbox=bbox, arrowprops=arrowprops)plt.show()

这里同样是annotate的应用,箭头指向可以标明变化的位置,论文作图时可以参考。下面是一些参数说明

text:str,该参数是指注释文本的内容

xy:该参数接受二维元组(float, float),是指要注释的点。其二维元组所在的坐标系由xycoords参数决定

xytext:注释文本的坐标点,也是二维元组,默认与xy相同

对于论文画图时需要查阅所需文字中英文形式时,可参考下面链接

https://www.cnblogs.com/chendc/p/9298832.html


下面这个是对上方学习内容的总结案例

import matplotlibimport matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(111)fig.subplots_adjust(top=0.85)# 分别在figure和subplot上设置titlefig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')ax.set_title('axes title')ax.set_xlabel('xlabel')ax.set_ylabel('ylabel')# 设置x-axis和y-axis的范围都是[0, 10]ax.axis([0, 10, 0, 10])ax.text(3, 8, 'boxed italics text in data coords', style='italic',        bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=15)font1 = {'family': 'Times New Roman',        'color':  'purple',        'weight': 'normal',        'size': 10,        }ax.text(3, 2, 'unicode: Institut für Festkörperphysik',fontdict=font1)ax.text(0.95, 0.01, 'colored text in axes coords',        verticalalignment='bottom', horizontalalignment='right',        transform=ax.transAxes,        color='green', fontsize=15)ax.plot([2], [1], 'o')ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),            arrowprops=dict(facecolor='black', shrink=0.05))plt.show()

Tick Locators and Formatters

设置tick(刻度)和ticklabel(刻度标签)也是可视化中经常需要操作的步骤,matplotlib既提供了自动生成刻度和刻度标签的模式(默认状态),同时也提供了许多让使用者灵活设置的方式。

下面是几个案例展示,体会刻度设置的不同之处

import matplotlib.pyplot as pltimport numpy as npimport matplotlibx1 = np.linspace(0.0, 5.0, 100)y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
# 使用axis的set_ticks方法手动设置标签位置的例子,该案例中由于tick设置过大,所以会影响绘图美观,不建议用此方式进行设置tickfig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)axs[0].plot(x1, y1)axs[1].plot(x1, y1)axs[1].xaxis.set_ticks(np.arange(0., 10.1, 2.))plt.show()

# 使用axis的set_ticklabels方法手动设置标签格式的例子fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)axs[0].plot(x1, y1)axs[1].plot(x1, y1)ticks = np.arange(0., 8.1, 2.)tickla = [f'{tick:1.2f}' for tick in ticks]axs[1].xaxis.set_ticks(ticks)axs[1].xaxis.set_ticklabels(tickla)plt.show()

#一般绘图时会自动创建刻度,而如果通过上面的例子使用set_ticks创建刻度可能会导致tick的范围与所绘制图形的范围不一致的问题。#所以在下面的案例中,axs[1]中set_xtick的设置要与数据范围所对应,然后再通过set_xticklabels设置刻度所对应的标签import numpy as npimport matplotlib.pyplot as pltfig, axs = plt.subplots(2, 1, figsize=(6, 4), tight_layout=True)x1 = np.linspace(0.0, 6.0, 100)y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)axs[0].plot(x1, y1)axs[0].set_xticks([0,1,2,3,4,5,6])axs[1].plot(x1, y1)axs[1].set_xticks([0,1,2,3,4,5,6])#要将x轴的刻度放在数据范围中的哪些位置axs[1].set_xticklabels(['zero','one', 'two', 'three', 'four', 'five','six'],#设置刻度对应的标签                   rotation=30, fontsize='small')#rotation选项设定x刻度标签倾斜30度。axs[1].xaxis.set_ticks_position('bottom')#set_ticks_position()方法是用来设置刻度所在的位置,常用的参数有bottom、top、both、noneprint(axs[1].xaxis.get_ticklines())plt.show()

# 接收字符串格式的例子fig, axs = plt.subplots(2, 2, figsize=(8, 5), tight_layout=True)for n, ax in enumerate(axs.flat):    ax.plot(x1*10., y1)formatter = matplotlib.ticker.FormatStrFormatter('%1.1f')axs[0, 1].xaxis.set_major_formatter(formatter)formatter = matplotlib.ticker.FormatStrFormatter('-%1.1f')axs[1, 0].xaxis.set_major_formatter(formatter)formatter = matplotlib.ticker.FormatStrFormatter('%1.5f')axs[1, 1].xaxis.set_major_formatter(formatter)plt.show()

相比于上述的案例,下面的这个注释更多,可读性更高,主要是定义的函数相比更简单。这个案例中展示了如何进行坐标轴的移动,如何更改刻度值的样式

import matplotlib.pyplot as pltimport numpy as npx = np.linspace(-3,3,50)y1 = 2*x+1y2 = x**2plt.figure()plt.plot(x,y2)plt.plot(x,y1,color='red',linewidth=1.0,linestyle = '--')plt.xlim((-3,5))plt.ylim((-3,5))plt.xlabel('x')plt.ylabel('y')new_ticks1 = np.linspace(-3,5,5)plt.xticks(new_ticks1)plt.yticks([-2,0,2,5],[r'$one\ shu$',r'$\alpha$',r'$three$',r'four'])'''上一行代码是将y轴上的小标改成文字,其中,空格需要增加\,即'\ ',$可将格式更改成数字模式,如果需要输入数学形式的α,则需要用\转换,即\alpha如果使用面向对象的命令进行画图,那么下面两行代码可以实现与 plt.yticks([-2,0,2,5],[r'$one\ shu$',r'$\alpha$',r'$three$',r'four']) 同样的功能axs.set_yticks([-2,0,2,5])axs.set_yticklabels([r'$one\ shu$',r'$\alpha$',r'$three$',r'four'])'''ax = plt.gca()#gca = 'get current axes' 获取现在的轴'''ax = plt.gca()是获取当前的axes,其中gca代表的是get current axes。fig=plt.gcf是获取当前的figure,其中gcf代表的是get current figure。许多函数都是对当前的Figure或Axes对象进行处理,例如plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。而在本例中则可以通过ax.spines方法获得当前顶部和右边的轴并将其颜色设置为不可见然后将左边轴和底部的轴所在的位置重新设置最后再通过set_ticks_position方法设置ticks在x轴或y轴的位置,本示例中因所设置的bottom和left是ticks在x轴或y轴的默认值,所以这两行的代码也可以不写'''ax.spines['top'].set_color('none')ax.spines['right'].set_color('none')ax.spines['left'].set_position(('data',0))ax.spines['bottom'].set_position(('data',0))#axes 百分比ax.xaxis.set_ticks_position('bottom')   #设置ticks在x轴的位置ax.yaxis.set_ticks_position('left')     #设置ticks在y轴的位置plt.show()

legend(图例)

这部分主要介绍图例的一些相关术语

legend entry(图例条目)

图例有一个或多个legend entries组成。一个entry由一个key和一个label组成。

legend key(图例键)

每个 legend label左面的colored/patterned marker(彩色/图案标记)

legend label(图例标签)

描述由key来表示的handle的文本

legend handle(图例句柄)

用于在图例中生成适当图例条目的原始对象

以下面这个图为例,右侧的方框中的共有两个legend entry;两个legend key,分别是一个蓝色和一个黄色的legend key;两个legend label,一个名为‘Line up’和一个名为‘Line Down’的legend label

作业

1.尝试在一张图中运用所讲过的功能,对title、text、xlable、ylabel、数学表达式、tick and ticklabel、legend进行详细的设计。

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom matplotlib.font_manager import FontPropertiesimport numpy as np
font1 = {'family': 'SimSun', 'alpha':0.7,'color':  'red', 'weight': 'normal', 'size': 20}font2 = {'family': 'Times New Roman', 'color':  'black', 'weight': 'normal', 'size': 8 }font3 = {'family': 'Tw Cen MT', 'color':  'black', 'weight': 'bold', 'size': 14 }font4 = {'family': 'Colonna MT', 'color':  'black','weight': 'normal','size': 14, }x = np.linspace(0.0, 5.0, 100)y = np.cos(2*np.pi*x) * np.exp(-x/3)y1= np.sin(2*np.pi*x) * np.exp(-x/5)plt.plot(x, y, '--',label='$\cos(2 \pi x) \exp(-x/3)$')plt.plot(x, y1, '--',label='$\sin(2 \pi x) \exp(-x/5)$')plt.title('作业图形', fontdict=font1)plt.xlabel('Y=time (s)', fontdict=font3)plt.ylabel('X=voltage(mv)', fontdict=font4)plt.legend()plt.subplots_adjust(left=0.15)plt.show()


参考:Datawhale第20期数据可视化讲义

链接:http://datawhale.club/t/topic/543

matplotlib xticks 基于 旋转_咬文嚼字——对matplotlib的文字绘图总结相关推荐

  1. matplotlib xticks 基于 旋转_数据可视化之 matplotlib 绘图篇

    本文转载于 SegmentFault 社区 作者:mhxin 引言 首先来看几个简单的图表, 下面 4 段不同的 matplotlib 绘图代码最终的结果是一样的,绘制的图形如下图所示. a = np ...

  2. python 3d绘图旋转_如何更改Matplotlib 3d旋转(mplot3d)的鼠标交互样式?

    我绘制了3D图,并用于quiver绘制x,y和z轴. 在matplotlib的交互式绘图中,我可以拖动和旋转3D绘图,但是存在一个问题: 当我拖动绘图时,似乎Z轴限制在一个平面上.无论我如何拖动绘图, ...

  3. python三维图形旋转_如何在matplotlib中旋转三维曲面

    在我的评论之后:import mayavi.mlab as mlab import numpy as np x,y = np.mgrid[-1:1:0.001, -1:1:0.001] z = x** ...

  4. python的matplotlib库内的函数_如何在matplotlib中找到函数下面的区域?

    我是python和matplotlib库的新手,我试图在绘图中得到函数行下方的区域.我有一个变量a&amp:b,它在我的绘图中移动一个矩形.我也许可以使用原始数学来解决这个问题,但我想知道是否 ...

  5. matplotlib的默认字体_浅谈matplotlib默认字体设置探索

    控制默认字体的设置 根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知: The base defau ...

  6. python安装matplotlib需要c编译_新安装matplotlib时缺少cbook

    我通过pip安装了ipython和matplot lib 当我试图import matplotlib.pyplot as plt时,我得到了这个错误:bash-4.2$ ipython Python ...

  7. python绘制相频特性曲线_数据分析之Matplotlib和机器学习基础

    一.Matplotlib基础知识 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 通过 Matplotlib,开发者可以仅需 ...

  8. 饼状图改变数据显示位置_这么用MatPlotLib视觉化呈现数据,你值得拥有

    全文共6661字,预计学习时长20分钟或更长 图片来源:pexels.com/@divinetechygirl 在现代数字世界中,数据就像空气一样重要. 人们每天都会自觉或不自觉地消费和产生大量数据. ...

  9. 用python画大白_[Python][可视化]matplotlib基础入门

    Python包matplotlib画图入门,以折线图为例. 在使用之前,导入matplotlib包,设置中文字体 import matplotlib.pyplot as plt %matplotlib ...

最新文章

  1. 树上问题 ---- E. Fib-tree(斐波那契数的性质 + 暴力模拟 + 认真计算复杂度)
  2. linux设备驱动之pci设备的驱动架构
  3. jar包的生成和使用简单例子
  4. 最短路径之Floyd算法
  5. 【CodeForces - 570A】Elections(模拟,水题)
  6. servlet-api-2.5.jar - jar not loaded
  7. C#中的深度学习:使用OpenCV进行硬币检测
  8. 上海新中考体育考试方案公布:总分30分不变
  9. iOS笔记之UIKit_UIButton
  10. 相同数据源情况下,使用Kafka实时消费数据 vs 离线环境下全部落表后处理数据,结果存在差异...
  11. Java常见算法(一)
  12. t-SNE可视化-Python实现
  13. 方阵平方等于自身,这个方阵的特征值
  14. 【编程语言】Java夯实基础(一):Java的起源与发展
  15. [转载]美国签证敏感专业列表Technology Alert List_拔剑-浆糊的传说_新浪博客
  16. uniapp小程序仿抖音切换内容
  17. 流氓软件强夺用户数据,马斯克截胡扎克伯格!
  18. Scapy:查看sniff函数抓取的包
  19. DuerOS业绩亮眼,如何成为了百度财报新增长点?
  20. 河南工业大雪c语言题库,河南工业大学C语言题库

热门文章

  1. Delphi中JSon SuperObject 使用:数据集与JSON对象互转
  2. javascript中的事件处理
  3. 配置ftp服务器亲测可用
  4. 阻塞IO模型-数据读写
  5. 《网络安全——应用技术与工程实践》
  6. 问题解决: SSR 的 1080 端口被占用
  7. C语言实现通用链表初步(四)----双向链表
  8. 使用easyexcel导入时间数据转换成Data的坑
  9. 日常生活小技巧 -- UART 回环测试
  10. C语言再学习 -- 时间函数