兄弟们,Python啥也不会,如何画出一张最基本的图?相较其他文章,本文特色是体系化,搞清楚画图的来龙去脉,一文掌握画图的核心三板斧及高频操作。
入门阶段
天才第一步,首先应该问下:绘图的基本骨架是什么?
我认为,核心主要有:图幅、横纵坐标、曲线类型
(曲线、散点、柱状)。
好开干,先导入对应的工具包:matplotlib
import matplotlib.pyplot as plt # 绘图用
import numpy as np # 数据处理用
其次,准备好相关的横纵坐标数据x, y
。
图源:ref1
那么如何用Python代码去实现对应功能呢?
基本流程:
- 横纵坐标数据
- 绘制图形
- 图片显示
对应函数:
plt.figure(num)
- 创建画板num,若无入参,则默认为1
- 返回对应画板句柄
plt.plot(x, y, format_string, **kwargs)
- x:x轴数据,列表或数组,可选
- y:y轴数据,列表或数组
- format_string:控制曲线的格式字符串,可选
- **kwargs:第二组或更多,(x,y,format_string)
- 注:当绘制多条曲线时,各条曲线的x不能省略
plt.show()
- 无入参,将plot绘制的曲线显示出来
示例:
import matplotlib.pyplot as plt
import numpy as np
x = list(range(32)) # x = [0, 31]
x = np.array(x) # list转为numpy数组
y = x**2 # y = x^2
plt.figure(1) # 新建一个画板
plt.plot(x, y) # 格式控制等可以省略
plt.show() # 结果显示
花式阶段
更进一步,过了雪中送炭阶段,来点锦上添花的东西。
花式操作:
- 曲线控制:颜色、粗细、实虚
- 图例、标题、横纵轴标签
- 网格线、坐标轴刻度范围
- 图片保存、关闭
对应函数:
- xlabel(‘xx’),横轴标签名
- ylabel(‘yy’),纵轴标签名
- title(‘title’),图标题
- legend(‘曲线说明’),添加图例说明不同曲线
- axis([xmin, xmax, ymin, ymax]) ,同时控制xy轴的范围
- xlim([xmin, xmax]),单独控制x轴的范围
- ylim([ymin, ymax]),单独控制y轴的范围
- grid(),显示网格线
- savefig(‘path with filename’),保存当前figure画板中的图
- close(fig1),关闭画板,通过figure()函数返回的句柄
实战DEMO
import matplotlib.pyplot as plt # 绘图用
import numpy as np # 数据处理用
import math as mt # 数学运算
def data_generation(max_val, band_num):
freq = range(max_val)
max_val_lg = mt.log10(max_val)
band_interval = max_val_lg / band_num
bands = []
for i in range(band_num):
tmp = mt.pow(10, i * band_interval) - 1
val = int(tmp)
if val < i:
val = i
bands.append(val)
return bands
def plot_basic(x, y):
plt.figure(1)
plt.plot(x, y)
plt.show()
def plot_advance(x, y0, y1):
fig2 = plt.figure(2)
# color: 'r/b/y/k/g',红、蓝、黄、黑、绿
# marker: 'o/.',大圆点、小点,表征显示描点,一般默认即可
# linestyle: 'solid/--, dashed/-, dotted, -.',实线,虚线,点虚线,点划线
l1 = plt.plot(x, y0, color='r',marker='o', linestyle='dashed', label='Me') # 返回结果为对线操作的句柄
l2 = plt.plot(x, y1, color='k',marker='.', linestyle='--', label='You') # 黑色,linestye: -, --实线,
plt.xlabel('time/day') # 显示横轴说明
plt.ylabel('salary/dollar') # 显示纵轴说明
plt.title('The change of salary')
plt.legend() # 显示图例,即每条线对应 label 中的内容
# plt.axis([-1, 33, -1, 480]) # [xmin, xmax, ymin, ymax]
plt.xlim(-1, 33) # 或单独设置
plt.ylim(-1, 280)
# plt.grid() # 显示网格背景
plt.grid(linestyle='--')
plt.show()
# plt.savefig('./salary.jpg')
fig2.savefig('./salary.jpg')
# plt.close(fig2)
if __name__ == "__main__":
y0 = range(30) # 刻画下理想中30天日薪增长情况
y1 = data_generation(480, 30)
x = range(30)
print('start processing...')
plot_basic(x, y1)
plot_advance(x, y0, y1)
print('done!')
效果图如下:
更多进阶用法见参考链接,里面涉及如一个画板中绘制多幅子图的方法。
如果小伙伴觉得本文有帮助,欢迎评论留言
哦,下一篇总结分享gif动图制作
。