请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3353354 新帖:0

matplotlib 数据可视化 - 图表属性

醒掌天下权发表于:5 月 10 日 00:40回复(1)

该文章为本人的学习笔记,笔记为原创,内容为参考(^__^) 嘻嘻……

import numpy as np
import matplotlib.pyplot as plt

为图表添加文本¶

  • title() 添加标题
  • xlabel() 为x轴添加标签
  • ylabel() 为y轴添加标签
plt.axis([0,5,0,20])
plt.title('标题')
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.plot([1,2,3,4],[1,4,9,16],'ro')  # 'ro'表示红色的圆点
plt.show()

修改文本属性:字体与颜色¶

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)  # fontsize指定字体大小,另外 fontname 可指定字体
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.plot([1,2,3,4],[1,4,9,16],'ro')  # 'ro'表示红色的圆点
plt.show()

在图表的任意位置添加文本¶

text()函数可在图表的任意位置添加文本,前两个参数指定位置,最后一个参数为文本

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')

plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

在文本中显示表达式¶

matplotlib 整合了 LaTeX 表达式,支持在图表中插入数学表达式。使用上,需要将表达式置于两个$之间

通常,只需要在包含 LaTeX 表达式的字符串前添加 r字符,表明它后面是原始文本,不能对其进行转义操作。

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')

plt.text(1.1,12,'$y=x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

添加网格¶

使用函数grid()

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')
plt.text(1.1,12,'$y=x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})

plt.grid(True)

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

添加图例¶

legend()函数可为图表添加图例

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')
plt.text(1.1,12,'$y=x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})
plt.grid(True)

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[1+2,4+2,9+2,16+2],'b*')
plt.plot([1,2,3,4],[1+5,4+5,9+5,16+5],'y^')

plt.legend(['图例一', '图例二', '图例三'], loc=0)  # 一定要在plot()之后

plt.show()

legend()函数中,第一个参数可图例的名称,第二个参数loc可指定位置,它的值分别有:

  • 0 最佳位置
  • 1 右上角
  • 2 左上角
  • 3 右下角
  • 4 左下角
  • 5 右侧
  • 6 左侧垂直居中
  • 7 右侧垂直居中
  • 8 下方水平居中
  • 9 上访水平居中
  • 10 正中间

保存代码¶

如果想把写了很长的代码保存下来,以方便下次使用,可以使用魔术命令 %save,后面跟上文件名和代码对应的命令提示符号码。

示例:

%save my_code 46
File `my_code.py` exists. Overwrite (y/[N])?  y
46 is neither a string nor a macro.

这样,会在当前工作目录下生成一个叫my_code.py的文件,里面的代码就是第46个单元里写的代码。

如果想将保存的代码恢复到编辑器中来,可使用魔术命令%load

示例:

%load my_code.py
# %load my_code.py
plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')
plt.text(1.1,12,'$y=x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})
plt.grid(True)

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[1+2,4+2,9+2,16+2],'b*')
plt.plot([1,2,3,4],[1+5,4+5,9+5,16+5],'y^')

plt.legend(['图例一', '图例二', '图例三'], loc=0)  # 一定要在plot()之后

plt.show()

另外,%run可在会话中运行py文件,这省略不作详解。

将会话转换成HTML文件¶

这个功能不需要写代码控制,直接点击 文件 》 下载 》 HTML 即可

将图表直接保存为图片¶

使用savefig()函数

plt.axis([0,5,0,20])
plt.title('标题',fontsize=20)
plt.xlabel('横轴')
plt.ylabel('纵轴')
plt.text(1,1.5,'文本一')
plt.text(2,4.5,'文本二')
plt.text(3,9.5,'文本三')
plt.text(4,16.5,'文本四')
plt.text(1.1,12,'$y=x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[1+2,4+2,9+2,16+2],'b*')
plt.plot([1,2,3,4],[1+5,4+5,9+5,16+5],'y^')
plt.legend(['图例一', '图例二', '图例三'], loc=0) 
plt.show()

plt.savefig('my_png.png')  # 指定图片名称与格式,将会保存到当前工作目录下
<Figure size 432x288 with 0 Axes>

谈谈日期值¶

先来看一个糟糕的日期值显示问题:

import datetime
import numpy as np
import matplotlib.pyplot as plt 

start_date = datetime.datetime.now().date()
date_list = [start_date - datetime.timedelta(days = i) for i in range(5)]
value_list = [i for i in range(5)]
plt.plot(date_list,value_list)
plt.show()

哦!我想可能是我需要换一副度数更高的眼镜了!

……

matplotlib.datas模块专门用于管理日期类型的数据,这里可以只显示年月,来简化数据,并且还要定义好时间的尺度。

示例:

import datetime
import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates  # 导入时间管理模块

months = mdates.MonthLocator()
days = mdates.DayLocator()
timeFmt = mdates.DateFormatter('%Y-%m')
start_date = datetime.datetime.now().date()
date_list = [start_date - datetime.timedelta(days = i*30) for i in range(5)]
value_list = [i for i in range(5)]
fig, ax = plt.subplots()
plt.plot(date_list,value_list)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(timeFmt)
ax.xaxis.set_minor_locator(days)
plt.show()

解析:

  • MonthLocator()指定月份的时间尺度
  • DayLocator()指定日的时间尺度
  • DateFormatter()指定时间格式
  • subplots()创建一个图形和一组副图
  • set_major_locator(months)/set_minor_locator(days)对x轴进行设置日期
  • set_major_formatter(timeFmt)指定日期格式
 

全部回复

0/140

量化课程

    移动端课程