使用matplotlib进行绘图

环境介绍

  • IDE是PyCharm专业版,社区版好像不支持图形可视化(不确定)。
  • 库是matplotlib、numpy、pandas。
  • 本文参考《利用python进行数据分析》一书,github地址请点这里

基本示例

简单尝试

#导入matplotil库,用于画图
import matplotlib.pyplot as plt
#导入numpy库,用于数据处理
import numpy as np
#画图
data = np.arange(10)
plt.plot(data)
#使图像展示出来
plt.show()

上面的代码展示了最简单的图片绘制。总结起来有一下几个步骤:

  1. 导入绘图和数据处理需要的库
  2. 导入需要绘制成图的数据,处理这些数据。比如本例中执行data = np.arange(10)生成从0-9的整数。
  3. 绘图并展示。这里需要说明,如果不执行plt.show(),在PyCharm中不会自动弹出绘制出来的图形,需要在PyCharm界面的最右侧点击‘Sciview’按钮进行查看。另在,如果是在Jupyter中绘图,需要加入代码matplotlib notebook,如果是在Ipython中运行,则需要加入代码matplotlib

上述代码的执行效果如下所示。

image

子图

#导入matplotil库,用于画图
import matplotlib.pyplot as plt
#导入numpy库,用于数据处理
import numpy as np
#画图
data = np.arange(10)
#第一种生成子图的方式
fig = plt.figure() #生成一个图片对象
#将fig划分成2行2列4个子图 ,a1表示第1个子图,对应subplot的三个参数。
a1 = fig.add_subplot(2,2,1)
#在生成两个子图
a2 = fig.add_subplot(2,2,2)
a3 = fig.add_subplot(2,2,3)

#绘图
plt.plot(np.random.randn(50).cumsum(),'k--')
_ = a1.hist(np.random.randn(100),bins=20,color = 'k',alpha=0.3)
a2.scatter(np.arange(30),np.arange(30)+2*np.random.randn(30))

#第二种生成子图的方式。
#生成2行3列的子图,sharex表示所有子图横坐标范围相同
fig,axs = plt.subplots(2,3,sharex=True)
#对在第1行第2列的子图进行绘制
axs[0,1].hist(np.random.randn(100),bins=20,color = 'k',alpha=0.3)
#使图像展示出来
plt.show()

常用的生成子图的方式有两种。

  • 对于第一种,先生成一个图片对象,然后在图片对象中添加子图。之后在自图上进行绘制。这里注意,如果直接执行plt.plot,默认是在最后生成的一张子图上进行绘制。比如本例中使用plt.plot(np.random.randn(50).cumsum(),'k--')绘制的图出现在了第子图中。‘k--’线条的一些属性,在下一节具体列出。也可以通过'子图名称.XXX'的方法来具体指定在哪个子图中绘制。如本例中使用a1.hist()命令在a1中绘制了柱状图。常见的图片类型见下表,更丰富的指令请参见官方文档。地址请点我!

    关键词 图片种类
    angle_spectrum 角度光谱
    bar 条形图
    barh 水平条图
    hist 直方图
    hist2d 2D直方图
    phase_spectrum 相位频谱
    pie 饼图
    ploar 极性图
    psd 功率光谱密度
    scatter 散点图
    specgram 光谱图
    stackplot 堆叠区域图
    step 步骤图

    第一种的图片效果如下所示;

    image
  • 第二种创建子图的方式与第一种类似。使用subplots创建一组图,其中参数中的2,3表示2行3列,sharex参数表示所有子图共享同样的横坐标范围。subplots还有一些其他的参数,具体请查看官网文档。在绘制子图时,可以使用如本例中axs[0,1]的方式进行指定,[0,1]参数表示第一行第二列的子图(行和列的计数从零开始)。效果如下所示。

    image
  • 可以使用plt.subplots_adjust()函数来调整子图间距。

颜色、标记、线性

#导入matplotil库,用于画图
import matplotlib.pyplot as plt
#导入numpy库,用于数据处理
import numpy as np
from numpy.random import randn
#画图
data = np.random.randn(30).cumsum()
plt.plot(data,color='k', linestyle='dashed', marker='o', label='One')
plt.plot(data,'r-', drawstyle='steps-post', label='Two')
#生成图例
plt.legend(loc='best')
plt.show()

上面的代码中有两个plt.plot,所以可以在同一个图中绘制两条不同的线。

  • 在第一句plt.plot的参数中,‘color’表示颜色,在这里k表示黑色,linestyle表示线条的类型,marker表示标记的类型。它们也可以简写成一个参数:‘ko--’,如第二句plt.plot中的参数‘r-’(代表红色实线)就是这种写法。需要注意的是,如果要用这种简写的方式指定标记的类型,该参数需要紧跟在颜色参数之后。比如‘ko--’中,o要紧跟在k之后。
  • 如果不指定drawstyle参数,则默认使用线性内插的方式使图像连续,在第二条线中,这个参数被指定为steps-post,意思是折现法内插,label属性相当于给每条线一个名字,便于生成图例。
  • plt.legend表示要生成图例,loc参数是指图例出现的位置,best是指自动选择位置。
  • 更多关于颜色、线条、标记的属性请参见官网文档。请点这里!

效果如下所示:

image

刻度,坐标轴,注释

# 导入matplotil库,用于画图
import matplotlib.pyplot as plt
# 导入numpy库,用于数据处理
import numpy as np
from numpy.random import randn

# 画图
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())

# 设置x轴上,哪些坐标处需要加刻度
ticks = ax.set_xticks([0, 250, 500, 750, 1000])
# 设置刻度的内容
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=45, fontsize='small')
# 设置横坐标的名称
ax.set_xlabel('Stages')
plt.show()
  • ax.set_xticks可以设置在哪些坐标处需要加刻度。
  • set_xticklabels可以设置刻度的内容,rotation参数可以用来设置旋转的角度,fontsize可以用来设置刻度的大小。
  • set_xlabel可以用来设置x轴的名称。

效果如下所示。

image
# 导入matplotil库,用于画图
import matplotlib.pyplot as plt
# 导入numpy库,用于数据处理
import numpy as np
from numpy.random import randn

from datetime import datetime
import pandas as pd

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

data = pd.read_csv('C:/Users/Nighthink/Downloads/pydata-book/examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']

spx.plot(ax=ax, style='k-')

crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy')
]

for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor='black', headwidth=4, width=2,
                                headlength=4),
                horizontalalignment='left', verticalalignment='top')

# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])

ax.set_title('Important dates in the 2008-2009 financial crisis')
  • 可以使用set_xlim函数来设置横坐标的显示范围,同理将x换成y可以设置纵坐标的显示范围。
  • set_title函数可以给图片添加一个标题
  • 可以使用ax.annotate方法来在指定的x和y坐标上绘制标签。

效果如下所示:

image

图片的保存

执行代码plt.savegif('fig.png',dpi=400,bbox_inches='tight')可以将图保存成png格式,文件名是fig,dpi参数表示每英寸点数的分辨率,bbox_inches参数可以用来控制实际图像四周的空白。

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