【matplotlib】可视化解决方案——如何正确使用plot方法

概述

matplotlib 库是一个非常强劲的 Python 的2D 绘图库。其中 pyplot 库是 matplotlib 的基于状态的接口。它提供了类似于 MATLAB 的绘图方式。pyplot 主要用于交互式绘图和程序化绘图生成的简单情况。我们可以使用如下代码导入 matplotlib 库和其他必要库。

import matplotlib.pyplot as plt #导入matplotlib库进行绘图
import numpy as np  #导入numpy库用以生成数据
#导入seaborn库用于让matplotlib有更好的绘制体验,seaborn库会更改底层matplotlib库设置
import seaborn as sns   

plot() 函数用以绘制折线图。适用场合是二维数据集(每个数据点包括两个值 x 和 y),尤其是那些趋势比单个数据点更重要的场合。它还适合多个二维数据集的比较。

函数的定义如下:

def plot(args,scalex = True,scaley = True,data = None,** kwargs):
    ...

参数介绍:

  • 参数1:x:指定 x 轴数据,默认 range(len(y))
  • 参数2:y:指定 y 轴数据
  • 参数3:fmt : str 型(可选),指定格式字符串
  • 参数4:scalex : bool 型, (可选),默认 True,指定 X 视图是否适用于数据限制
  • 参数5: scalex: bool 型, (可选),默认 True,指定 Y 视图是否适用于数据限制。
  • 参数6:data : 指定需要标记的数据(可选)
  • 参数7:kwargs:指定要是用的 Line2D 类属性
  • 返回值1:包含绘制数据的线列表,即存放 Line2D 实例的列表,有几条线就返回包含几个 Line2D 实例的列表。

返回值示例:

[<matplotlib.lines.Line2D object at 0x000001F7EDE0A190>] 
[<matplotlib.lines.Line2D object at 0x000001F7EDE0A4F0>]

[marker][linestyle][color],其中三者的顺序可以调换,当 fmt 与关键字参数冲突的时候,关键字参数优先。

  • marker:指定标记点样式;
  • linestyle:指定折线线性;
  • color:指定线条颜色;

scalexscaley参数是指假设数据画图大于当前窗口的时候是否自动扩大窗口以适应数据大小。
color属性的设置会覆盖 markeredgecolor 和 markerfacecolor 的初始设置。
Line2D参数的详细说明见 Line2D 专题。

以下是官网文档中中该函数的使用例子:

x = np.arange(10)
y = 2 * x  + np.random.randint(0, 20)

exp1:plot(x, y)        # plot x and y using default line style and color
exp2:plot(x, y, 'bo')  # plot x and y using blue circle markers
exp3:plot(y)           # plot y using x as index array 0..N-1
exp4:plot(y, 'r+-.')     # ditto, but with red plusses

画图结果如下:

官方示例

官方示例说明:

  • exp1: 传递了 X、Y 两个参数,即传递了 X 和 Y 两个维度的数据,剩下的都是用默认值。
  • exp2: 传递了 X、Y 以及 fmt 三个参数,fmt 参数中 b 代表 blue 表示线条为蓝色 o 代表标记点样式是圆形。
  • exp3: 传递了 Y 一个参数,由图可知图一与图三相同,证明了值传递一个 Y 参数的情况下,X 默认为 len(Y)。
  • exp4: 传递了 Y 和 fmt 两个参数,fmt 参数中 r 代表 red 表示线条为红色,+表示标记点都是+这个符号,-. 表示线条样式为“点横”线。

参数设置

plot 函数绘制折线图的时候可以有两种设置方式:第一种是在绘图调用 plot 函数的时候直接指定参数从而设置属性。第二种方法是绘图完毕后对返回的 Line2D 实例进行属性设置。

直接指定参数

line = plt.plot(
          np.sin(np.arange(0, 10)),
          antialiased=True, #指定进行抗锯齿
          scalex=True,  #X轴受数据制约
          scaley=True,  #Y轴受数据制约
          linewidth=1.0,    #指定线宽1.0
          linestyle=None,   #指定线条样式为默认
          color='#FF0000',  #指定线条颜色为RGB(255,0, 0)
          marker='o',   #指定标记点样式o
          markersize=7.0,   #指定标记点大小7.0
          markeredgewidth=0.0,  #指定标记点边缘宽度0.0
          markeredgecolor='#F0E68C',    #指定边缘颜色
          markerfacecolor='#000000',    #指定标记点颜色
          markerfacecoloralt='#FF0000', #指定标记点备用颜色
          fillstyle='full', #指定填充模式为完全填充
          drawstyle='default',  #指定绘图模式为默认线形图
          solid_capstyle='butt',    #指定实线笔帽样式
          label='第' + '1' + '条线',
)
plt.title('plot示例', fontsize=20)
plt.legend()
plt.grid(False)
plt.xlabel('X', fontsize=20)
plt.ylabel('Y', fontsize=20)
plt.show()

画图结果如下:

设置属性

使用 set_property 方法

绘制完毕之后我们想更改单独线条的属性,对相应的 Line2D 实例使用 set_property 方法进行设置:

line[0].set_linewidth(15)   #设置线宽15
line[0].set_color('#000000') #设置线条颜色RGB为0
line[0].set_markerfacecolor('#FFFFFF')  #设置标记点颜色位白色

画图结果如下:

设置属性2

使用反馈设置方法最大的用处在于绘制多条线条时,可以分别设置属性,下例是调用两次 plot 函数并分别设置属性:

line_sin = plt.plot(np.sin(np.arange(0, 10, 0.01)))
line_cos = plt.plot(np.cos(np.arange(0, 10, 0.01)))

line_cos[0].set_linewidth(15)   #设置cos的线宽15
line_sin[0].set_linestyle('dashed') #设置sin的线条样式为.

画图结果如下:

设置多个实例属性

画多个下折线图的时候也可以传递 X1,Y1,fmt1,X2,Y2,fmt2这样的组合参数用一个 plot 函数就绘制多条折线图。

#花两条线sin和cos
line = plt.plot(np.arange(0, 10, 0.01), np.sin(np.arange(0, 10, 0.01)), 'r', 
                np.arange(0, 10, 0.01), np.cos(np.arange(0, 10, 0.01)), 'b')

line[0].set_linewidth(5)    #设置第一条线宽5
line[0].set_linestyle('dashed') #设置第一条线条样式为dashed

line[1].set_color('#000000')    #设置第二条线颜色为黑色
line[1].set_linestyle('--') #设置第二条线条样式为--

画图结果如下:

传递多个参数

应用

不同参数设置的可视化程序如下:

figure = plt.figure(1, figsize=(15, 15))

ax1 = figure.add_subplot(331)
ax2 = figure.add_subplot(332)
ax3 = figure.add_subplot(333)
ax4 = figure.add_subplot(334)
ax5 = figure.add_subplot(335)
ax6 = figure.add_subplot(336)
ax7 = figure.add_subplot(337)
ax8 = figure.add_subplot(338)
ax9 = figure.add_subplot(339)

#正常
ax1.plot(np.sin(np.arange(0, 10, 0.1)), label='正常')
ax1.set_title('正常')
ax1.legend()

#更改标记点样式
ax2.plot(np.sin(np.arange(0, 10, 0.1)), marker='*', label='更改标记点样式')
ax2.set_title('marker=\'*\'')
ax2.legend()

#更改线条样式
ax3.plot(np.sin(np.arange(0, 10, 0.1)), linestyle='--', label='更改线条样式')
ax3.set_title('linestyle=\'--\'')
ax3.legend()

#更改标记点颜色
ax4.plot(np.sin(np.arange(0, 10, 0.1)), marker='*', markerfacecolor='#F0E68C', label='更改标记点颜色')
ax4.set_title('markerfacecolor=\'#F0E68C\'')
ax4.legend()

#更改标记点边缘颜色
ax5.plot(np.sin(np.arange(0, 10, 0.1)), marker='*', markeredgecolor='#F0E68C', label='更改标记点边缘颜色')
ax5.set_title('markeredgecolor=\'#F0E68C\'')
ax5.legend()

#更改线条宽度
ax6.plot(np.sin(np.arange(0, 10, 0.1)), linewidth=8, label='更改线条宽度')
ax6.set_title('linewidth=8')
ax6.legend()

#更改画图模式
ax7.plot(np.sin(np.arange(0, 10, 0.1)), drawstyle='steps', label='更改画图模式')
ax7.set_title('drawstyle=\'steps\'')
ax7.legend()

#更改填充模式
ax8.plot(np.sin(np.arange(0, 10, 0.1)), marker='o', markerfacecolor='#F0E68C', markerfacecoloralt='#FF0000', fillstyle='left', label='更改填充模式')
ax8.set_title('fillstyle=\'left\'')
ax8.legend()

#更改标记点大小
ax9.plot(np.sin(np.arange(0, 10, 0.1)), marker='o', markersize=5, label='更改标记点大小')
ax9.set_title('markersize=15')
ax9.legend()

画图结果如下:

属性可视化

往期回顾

  1. 【matplotlib】可视化解决方案——如何向画布中添加坐标轴
  2. 【matplotlib】可视化解决方案——如何正确使用matplotlib颜色系统
  3. 【matplotlib】可视化解决方案——如何实现画布局部放大功能
  4. 【matplotlib】可视化解决方案——如何更改matplotlib配置信息
  5. 【matplotlib】可视化解决方案——如何定制化网格
  6. 【matplotlib】可视化解决方案——如何向画布添加交叉直线
  7. 【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题
  8. 【matplotlib】可视化解决方案——如何设置matplotlib风格集
  9. 【matplotlib】可视化解决方案——如何设置轴标签的透明度和大小
  10. 【matplotlib】可视化解决方案——如何向图表中添加数据表

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容