Python matplotlib绘制折线图及实例(提高版)

511 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前提提要:传送门, 在上次的基础上,我们增加对生成图片的样式修改,使图片更加高质量。

1.设置图片大小(高清无码大图)并保存到本地

  • 代码如下:
from matplotlib import pyplot as plt

#设置图片大小
#figsize=(长度,高度), dpi=每单位的像素点
fig = plt.figure(figsize=(20,8), dpi=80)

x = range(2, 26, 2)
y = [15, 12.2, 14, 14, 34, 43, 23, 34, 11.5, 22, 23, 12]

#绘图
plt.plot(x, y)

#保存本地-设置.png防止放大失真
plt.savefig("./t1.png")

#展示图形
plt.show()

2. 描述信息,如x轴和y轴表示含义,以及图表标题含义。

  • 代码如下:
from matplotlib import pyplot as plt
import random

y = [random.randint(20, 35) for i in range(120)]
x = range(120)

fig = plt.figure(figsize=(16,6),dpi=80)

##调整x轴刻度并添加汉字解释
_xticks_lable = ["10点{}分".format(i) for i in range(60)]
_xticks_lable += ["11点{}分".format(i) for i in range(60)]
#取步长,数据与字符串一一对应
plt.xticks(list(x)[::3], _xticks_lable[::3], rotation=45)#字符串旋转45度
plt.yticks(y)

plt.plot(x,y)
plt.show()
  • 运行结果:

image.png

运行之后,如图,发现x坐标轴没有显示汉字,而是方框。这是由于matplotlib默认字体没有汉字,需要我们自己修改默认设置才可以。
这里博主推荐一篇matplotlib修改默认字体的文章,博主用的方法一,亲测有效。传送门

3. 线条的样式(比如颜色、透明度、图例等)

##绘制两条折线并添加图例
from matplotlib import pyplot as plt
from matplotlib import font_manager

# 使用my_font存出一个加载的中文字体
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')

x = range(11, 31)
y1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]

##设置x轴
x_labels=["{}岁".format(i) for i in range(11,31)]
plt.xticks(list(x), x_labels,rotation=45, fontproperties=my_font)

##详细信息
plt.xlabel("年龄", fontproperties=my_font)
plt.title("数目随年龄变化曲线", fontproperties=my_font)

##绘制网格,横竖线根据x,y坐标轴数目
plt.grid(alpha=0.5, linestyle=":")#alpha设置网格透明度,linestyle设置线条样式点状

#绘制图形,设置线条样式
plt.plot(x, y1, label="小明", color="red", linestyle="--")
plt.plot(x, y2, label="小红", linewidth=3, alpha=0.5)

#添加图例,不能使用fontproperties
plt.legend(loc="best",prop=my_font)#loc调整显示位置,prop设置字体

plt.show()

4. 标记出特殊的点(比如最高点和最低点在哪里)

假设最高点为(23,6),添加代码语句如下:

#添加最高点
plt.text(23,6, "max", color="r")#前面表示图中实际坐标,中间是标注的内容,最后是颜色信息

5. 给图片添加一个水印(防止盗用)

#加图水印
from __future__ import print_function
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.image as image
import matplotlib.pyplot as plt

# Fixing random state for reproducibility
np.random.seed(1996)

datafile = cbook.get_sample_data('logo.png', asfileobj=False)
print('loading %s' % datafile)
im = image.imread(datafile)
im[:, :, -1] = 0.5  # set the alpha channel

fig, ax = plt.subplots()

ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=0.7, mfc='orange')
ax.grid()
fig.figimage(im, 5, 5, zorder=3)

plt.show()