Matplotlib学习(1、matplotlib入门)
程序员文章站
2022-03-18 17:01:17
...
import numpy as np
from matplotlib import pyplot as plt
import matplotlib
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#有中文出现的情况,需要u'内容'
# data = np.arange(10)
# plt.plot(data)
# plt.show()
'''1.1 图片与子图'''
'''matplotlib所绘制的图位于图片(Figure)对象中。你可以使用plt.figure生成一个新的图片:'''
# fig = plt.figure()
'''你不能使用空白的图片进行绘图。需要使用add_subplot创建一个或多个子图(subplot);
下列代码的意思是图片应该是2X2的(最多四个图形),并且我们选择了四个图形中的第一个(序号从1开始)'''
# ax1 = fig.add_subplot(2, 2, 1)
# ax2 = fig.add_subplot(2, 2, 2)
# ax3 = fig.add_subplot(2, 2, 3)
'''当你输入下面代码,matplotlib会在最后一个图片和子图(如果需要的话就创建一个)上进行绘制,从而隐藏图片和子图的创建。'''
# plt.plot([1.5, 3.5, -2, 1.6])
'''"k--"是用于绘制黑色分段线的style选项。fig.add_subplot返回的对象是AxesSubplot对象,使用这些对象你可以直接在其他空白的子图上调用对象的实例方法进行绘图'''
# plt.plot(np.random.randn(50).cumsum(), 'k--')
# ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
# ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
'''使用子图网格创建图片是非常常见的任务,所以matplotlib包含了一个便捷方法plt.subplots,它创建一个新的图片,然后返回包含了已生成子图对象的NumPy数组:'''
# fig, axes = plt.subplots(2, 3) #创建6个空白子图,2行3列
'''
表:pyplot.subplots选项
参数 描述
nrows 子图的行数
ncols 子图的列数
sharex 所有子图使用相同的x轴刻度(调整xlim会影响所有子图)
sharey 所有子图使用相同的y轴刻度(调整ylim会影响所有子图)
subplot_kw 传入add_subplot的关键字参数字典,用于生成子图
**fig_kw 在生成图片时使用的额外关键字参数,例如plt.subplots(2, 2, figsize= (8,6))
'''
'''1.1.1 调整子图周围的间距'''
'''默认情况下,matplotlib会在子图的外部和子图之间留出一定的间距。这个间距都是相对于图的高度和宽度来指定的,所有如果调整窗口的大小,那么图就会自动调整。你可以使用图对象上的subplots_adjust方法更改间距,也可以用作顶层函数'''
# subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
'''wspace和hspace分别控制的是图片的宽度和高度百分比,以用作子图间的间距。下面举个例子:将间距一直缩小到零:'''
# fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
# for i in range(2):
# for j in range(2):
# axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
# plt.subplots_adjust(wspace=0, hspace=0) #生成一个“没有内部子图间隔的数据可视化”
'''1.2 颜色、标记和线类型'''
'''matplotlib的主函数plot接收带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型。
例如,要用绿色破折号绘制x对y的线,你需要执行:'''
# ax.plot(x, y, 'g--')
# ax.plot(x, y, linestyle='--', color='g') #这个书写格式更为标准
'''折线图还可以有标记用来凸显实际的数据点。由于matplotlib创建了一个连续性折线图,插入点之间有时并不清除点在哪。标记可以是样式字符串的一部分,样式字符串中线类型、标记类型必须跟在颜色后面:'''
# plt.plot(np.random.randn(30).cumsum(), 'ko--')
# plt.plot(np.random.randn(30).cumsum(), color='k', linestyle='dashed', marker='o') #或者写成这样
'''对于折线图,你会注意到后续的点默认是线性内插的。可以通过drawstyle选项进行更改:'''
# data = np.random.randn(30).cumsum()
# plt.plot(data, 'k--', label='Default')
# plt.plot(data, 'k-', drawstyle='steps-post', label='steps=post')
# plt.legend(loc='best') #best是指自适应模式,为每条线生成一个用于区分的图例
'''1.3 刻度、标签和图例'''
'''对于大多数图标修饰工作,有两种主要的方式:使用程序性的pyplot接口和更多面向对象的原生matplotlib API。
pyplot接口设计为交互式使用,包含了像xlim、xticks和xticklabels等方法。这些方法分别控制了绘图范围、刻度位置以及刻度标签。我们可以在两种方式中使用:
1)、在没有函数参数的情况下调用,返回当前的参数值(例如plt.xlim()返回当前的x轴位图范围)。
2)、传入参数的情况下调用,并设置参数值(例如plt.xlim([0, 10])会将x轴的范围设置为0到10)
所有的这些方法都会在当前活动的或最近创建的AxesSubplot上生效。这些方法中的每一个对应于子图自身的两个方法。比如xlim对应于ax.get_lim和ax.set_lim。'''
'''1.3.1 设置标题、轴标签、刻度和刻度标签'''
# fig = plt.figure()
# ax = fig.add_subplot(1, 1, 1)
# ax.plot(np.random.randn(1000).cumsum())
'''要改变x轴刻度,最简单的方式是使用set_xticks和set_xticklabels
set_xticks表示在数据范围内设定刻度的位置,默认情况下,这些刻度也有标签。
但是我们可以使用set_xticklabels为标签赋值:'''
# ticks = ax.set_xticks([0, 250, 500, 750, 1000]) #使行标签按列表中的数值设定刻度
# labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small') #给行标签的刻度值设定名称
# ax.set_title('My first matplotlib plot') #设置图上的标题
# ax.set_xlabel('Stages') #设置行标签的名称
'''修改y轴坐标是相同过程,将上面示例中的x替换成y即可。轴的类型拥有一个set方法,允许批量设置绘图属性。'''
# props = {
# 'title': '我的第一个matplotlib plot',
# 'xlabel': '阶段'
# }
# ax.set(**props)
'''1.3.2 添加图例'''
'''图例是用来区分绘图元素的另一个重要内容。有多种方式可以添加图例。最简单的方式是在添加每个图标时传递label参数:'''
# fig = plt.figure(); ax = fig.add_subplot(1, 1, 1)
# ax.plot(np.random.randn(100).cumsum(), 'k', label='one')
# ax.plot(np.random.randn(100).cumsum(), 'k--', label='two')
# ax.plot(np.random.randn(100).cumsum(), 'k.', label='three')
# ax.legend(loc='best') #如果缺少这行代码,就会不显示图例
'''loc参数告诉matplotlib在哪里放置图标。一般best是最好的选择,它会自动选择最合适的位置。如果取消图例中的元素,不要传入label参数或者传入label='_nolegend_'。'''
'''1.4 注释与子图加工'''
'''除了标准的绘图类型,你可能还会想在图标上绘制自己的注释,而且注释中可能会包含文本、箭头以及其他图形。你可以使用text、 arrow和annote方法来添加注释和文本。text在图表上给定的坐标(x, y),根据可选的定制样式绘制文本:'''
# ax.text(x, y, 'Hello world!', family='monospace', fontsize=10)
'''注释可以同时绘制文本和箭头。比如有一份4月每天的移动发展量清单,要做线性图:'''
from datetime import datetime
import pandas as pd
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
data = pd.read_csv('4月移动发展量.csv', engine='python', index_col=0, parse_dates=True)
#index_col=0表示不要索引,parse_dates=True表示把时间变成“2019-04-23”这样的标准格式
num = data['移动发展量']
num.plot(ax=ax, style='k-')
crisis_data = [
(datetime(2019, 4, 1), '月头'),
(datetime(2019, 4, 15), '月中'),
(datetime(2019, 4, 30), '月底')
]
for date, label in crisis_data:
ax.annotate(label, xy=(date, num.asof(date)),
xytext=(date, num.asof(date)),
arrowprops=dict(facecolor='black', headwidth=4, width=2, headlength=4),
horizontalalignment='left', verticalalignment='top')
ax.set_xlim(['2019-3-30', '2019-5-2'])
ax.set_ylim([1000, 2800])
ax.set_title('4月每日移动销售')
'''ax.annotate方法可以在指定的x和y坐标上绘制标签。
使用set_xlim和set_ylim方法手动设置图表的边界,而不是使用matplotlib的默认设置。
最后,ax.set_title给图表添加了一个主标题'''
'''绘制图形时有更多需要注意的地方。matplotlib含有表示多种常见图形的对象,这些对象的引用是patches。
一些图形,比如Rectangle(矩形)和Circle(圆形),可以在matplotlib.pyplot中找到,但图形的全集位于matplotlib.patches。
想在图表中添加图形时,你需要生成patch(补丁)对象shp,并调用ax.add_patch(shp)将它加入到子图中:'''
# fig = plt.figure()
# ax = fig.add_subplot(1, 1, 1)
# rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3) #长方形、矩阵
# circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3) #圆形
# pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],
# color='g', alpha=0.5) #三角形
# ax.add_patch(rect)
# ax.add_patch(circ)
# ax.add_patch(pgon)
'''1.5 将图片保存到文件:'''
'''你可以使用plt.savefig将活动图片保存到文件。这个方法等价于图片对象的savefig实例方法。例如将图片保存为jpg:'''
# plt.savefig('4月每日移动销售.jpg')
'''可以使用几个重要的选项来发布图形:dpi,它控制每英寸点数的分辨率;bbox_inches,可以修剪实际图形的空白。
为了得到同样一个PNG图片,且使用最小的空白,拥有400DPI,需要运行以下代码:'''
plt.savefig('4月每日移动销售.csv', dpi=400, bbox_inches='tight')
'''
表:figure.savefig选项
参数 描述
fname 包含文件路径或Python文件型对象的字符串。图片格式是从文件扩展名中推断出来的
(例如PDF格式的.pdf或PNG的.png格式)
dpi 每英寸点数的分辨率,默认为100,但可以配置
facecolor,edgecolor 子图之外的图形背景的颜色;默认情况下是'w'(白色)
format 文件格式(eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff)
bbox_inches 要保存的图片范围;如果传递'tight',将会去除掉图片周围空白的部分
'''
plt.show()