首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用python画图——带你入门matplotlib

如何用python画图——带你入门matplotlib

作者头像
MeteoAI
发布2019-07-22 18:11:34
2.8K0
发布2019-07-22 18:11:34
举报
文章被收录于专栏:MeteoAIMeteoAI

点击蓝色字关注我们吧!

matplotlibpython中常用的一个可视化库,大多数的操作与MATLAB非常类似,所以对于从MATLAB迁移到python的朋友是非常友好的。matplotlib使用numpy进行数组运算,也支持pandas的Series直接用于matplotlib画图。

关于matplotlib的介绍我们将分为两期,本期主要介绍一些基本操作,下一期介绍一下稍微复杂一些的实例操作,及其一些画图设置。

下面简单介绍一下matplotlib的基本操作,带领大家入门。这里不可能面面俱到,更加详细的内容大家可以进一步参考官网。matplotlib官网(https://matplotlib.org/)

1. 简单画图示例

先来一道appetizer,带大家感受一下matplotlib画图的基本操作及流程。要画出好看的图,对这些基础知识的了解必不可少。

# 1.0 生成画图实验数据
x = np.linspace(-10, 30, 100)  
y1 = 0.1*x**3 - 10*x**2 + np.pi
y2 = - y1-1500

# 1.1 画图
plt.figure(figsize=(8,6),dpi=100) # 设置画图大小和分辨率
l1, = plt.plot(x, y1, c='steelblue', linewidth=2.0, linestyle='-') 
l2, = plt.plot(x, y2, c='seagreen', linewidth=2.0, linestyle='--') 

# 更多设置参考: [plot参数设置](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot)
# 更多色彩设置: ![image](https://i.stack.imgur.com/k2VzI.png)

# 1.2 设置x,y轴取值范围和标签
plt.xlim((-10, 10))   # x取值范围
plt.ylim((-1500, 100))   # y取值范围
plt.xlabel('X',fontsize=20)  # x标签
plt.ylabel('Y',fontsize=20)  # y标签

# 1.3 设置新的刻度点
plt.xticks([-10,-5,0,5,10]) 
plt.yticks(np.linspace(-1600,100,18)) # 在[-1500,100]线性生成17个点
# 设置刻度点的一些属性,这里仅为了展示功能,视觉效果大家可以自己去尝试一下
plt.tick_params(labelcolor='firebrick', labelsize='20', width=1)
# 也可以把数字映射为字符串:
# plt.xticks([-10,-5,0,5,10],['S','M','L','XL','XXL']) 

# 1.4 legend
plt.legend(handles=[l1,l2],labels=['Blue','Green'],loc='best',prop={'size': 10},ncol=2,framealpha=0.3)

# # loc 参数:
# 'best' : 0,          
# 'upper right'  : 1,
# 'upper left'   : 2,
# 'lower left'   : 3,
# 'lower right'  : 4,
# 'right'        : 5,
# 'center left'  : 6,
# 'center right' : 7,
# 'lower center' : 8,
# 'upper center' : 9,
# 'center'       : 10

# 1.5 title
plt.title('Title',size=20)
# # gca = 'get current axis'
# ax = plt.gca()

# 1.6 存图
plt.savefig("test.png", dpi=100)

plt.show()

2. 柱状图示例

很多时候我们需要绘制柱状图,那么用matplotlib怎么实现呢?很简单:

x_bar = [10, 20, 30, 40, 50] 
y_bar = [0.2, 0.7, 0.6, 0.9, 0.6] 

# 画图:
plt.figure(figsize=(6,5),dpi=100) # 设置画图大小和分辨率
bars = plt.bar(x_bar, y_bar, color='steelblue', label=x_bar, width=5) 

# 在柱状图上标注数值:
for i, rec in enumerate(bars):
    x_text = rec.get_x()  # 获取柱形图横坐标 可以+/-数值使其居中
    y_text = rec.get_height() + 0.02 # 获取柱子的高度 +0.02
    plt.text(x_text, y_text, '%.2f' %y_bar[i], fontsize=15) # 标注文字

# 坐标轴设置:
plt.ylim((0, 1))   # y取值范围
plt.xlabel('X',fontsize=20)  # x标签
plt.ylabel('Y',fontsize=20)  # y标签
plt.tick_params(labelcolor='black', labelsize='15', width=1)

plt.show()

3. 散点图与subplot

散点图可以直观的展示变量之间的关系,也是我们常用的绘图类型,下面介绍一下如何用matplotlib绘制散点图,及用子图的方式展现对比。

plt.figure(figsize=(16,8), dpi=100) # 设置画图大小和分辨率

## 生成随机数:
X = np.random.normal(10, 20, 666)   # 正态分布 mean = 10, std = 20
Y = np.random.normal(6, 66, 666)     # 正态分布 mean = 6, std = 66

color = X + Y # 用颜色来区分散点的数值
size = ((X - Y)/10 + 0.001)**2 # 用大小来区分散点的数值

## 画图:
# subplot(行序号, 列序号, 图序号)
# plt.subplot(n_rows, n_cols, plot_num)

## subplot 1
plt.subplot(1, 2, 1)
plt.scatter(X, Y, s = 100, c = color, alpha=.6)
plt.xticks(())  # ignore xticks
plt.yticks(())  # ignore yticks
## subplot 2
plt.subplot(1, 2, 2)
plt.scatter(X, Y, s = size, c = 'seagreen',alpha=.6)
plt.xticks(())  # ignore xticks
plt.yticks(())  # ignore yticks

plt.tight_layout()
plt.show()

4.图中图

有时候我们需要在图中画一些小的子图,这时候就要了解图中图的画法了。

fig = plt.figure(figsize=(10,6), dpi=100)x = np.linspace(0,12,20)
y = x**1.6
left, bottom, width, height = 0.1, 0.1, 0.9, 0.9

## 外图
ax1 = fig.add_axes([left, bottom, width, height]) 
ax1.plot(x, y, 'indianred')
# 坐标轴及标题设置:
ax1.set_xlabel('X',fontsize=20)  # x标签
ax1.set_ylabel('Y',fontsize=20)  # y标签
ax1.tick_params(labelcolor='black', labelsize='15', width=1)
ax1.set_title('title outside',fontsize=20)

## 内图1
ax2 = fig.add_axes([0.15, 0.5, 0.3, 0.4])  
ax2.plot(y, np.exp(x)/10000, 'steelblue')
ax2.set_title('title inside 1')

## 内图2
ax3 = fig.add_axes([0.55, 0.65, 0.15, 0.25]) 
ax3.plot(y, x, 'black')
ax3.set_xlabel('x')
ax3.set_ylabel('y')
ax3.set_title('title inside 2')

## 内图3
## 还可以用另一种方式添加子图:
plt.axes([0.67, 0.175, 0.3, 0.35])
plt.plot(y[::-1], np.log(x+0.01), 'seagreen')
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 3')

plt.show()

5.一个栗子

在掌握了以上matplotlib的基础后,我们可以我们可以借助matplotlib画出比较成熟的示意图,如下:

# 网上的一个栗子,供参考

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(8, 5), dpi=80)
ax = plt.subplot(111)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="Cos Function")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="Sin Function")

plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.ylim(C.min() * 1.1, C.max() * 1.1)
plt.yticks([-1, +1],
           [r'$-1$', r'$+1$'])

t = 2 * np.pi / 3
plt.plot([t, t], [0, np.cos(t)],
         color='blue', linewidth=1.5, linestyle="--")
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
             xy=(t, np.sin(t)), xycoords='data',
             xytext=(+10, +30), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.plot([t, t], [0, np.sin(t)],
         color='red', linewidth=1.5, linestyle="--")
plt.scatter([t, ], [np.sin(t), ], 50, color='red')
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
             xy=(t, np.cos(t)), xycoords='data',
             xytext=(-90, -50), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.legend(loc='upper left', frameon=False)
plt.show()

6.又一个栗子

我们经常会遇到要画序列对比的图,下面就是一个简易的“画图模板”,供大家参考。

x = np.linspace(1,100,100)
y1 = np.random.randint(-10,50,(100,))
y2 = np.random.randint(-10,50,(100,))

fig = plt.figure(figsize=(16,10),dpi=100)
ax1 = fig.add_subplot(211)

l1,=ax1.plot(x,y1, c='steelblue', label='y1')
ax1.tick_params(labelcolor='k', labelsize='20', width=3)
ax1.set_ylabel("y1",fontsize=20)

ax2 = fig.add_subplot(212)
l1,=ax2.plot(x,y2, c='indianred', label='y2')
ax2.tick_params(labelcolor='k', labelsize='20', width=3)
ax2.set_xlabel("x",fontsize=20)
ax2.set_ylabel("y2",fontsize=20)
plt.subplots_adjust(hspace =0.15)
plt.show()

好了,这一期的matplotlib入门介绍就到这里啦,不可能面面俱到,更多内容需要大家自己查阅官网,参考部分给大家提供了一些学习资源供参考。

下一期我们将从毕业论文的绘图实例出发,给大家深入介绍matplotlib的一些进阶操作

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MeteoAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简单画图示例
  • 2. 柱状图示例
  • 3. 散点图与subplot
  • 5.一个栗子
  • 6.又一个栗子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档