目录
  1. 1. 基础绘图查阅
  2. 2. Scatter基础用法
  3. 3. 覆盖函数
  4. 4. Contour :简易上手教
  5. 5. contourf :填充等高线图
  6. 6. 解决中文显示&负号显示问题
  7. 7. 把图表中所有的内容设置为Times New Roman 格式
python-matplotlib案例
涉及知识点 示例图片
基础绘图查阅:
1. plot的基础用法
2. 坐标轴的刻度绘制plt.xticks
3. 坐标轴的移动 ax.spines
4.坐标轴的范围 plt.xlim(x.min()*1.1)
5.循环设置字体的大小:plt.gca.get_xticklabels.set_fontsize(16)
6.标签的绘制 plt.legend
7. annotation 的用法
覆盖函数:
1. full_between(x的范围,下限,上限,facecolor,alpha)
等高线图:contour
1. 可以控制字是否在线上
2. 等高线数字的位置控制
3.登高线的密度
4.clabel的使用
等高线图填充函数:contourf
Scatter基础用法
1. 控制圆的大小和颜色
2. 透明度:alpha
matplot_annotation实例参考
[解决中文显示&负号显示问题](# 中文显示 )
[把图表中所有的内容设置为Times New Roman 格式](# 字体设置)

基础绘图查阅

import matplotlib.pyplot as plt 
import numpy as np

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

plt.figure(figsize=(20, 6), dpi=80)
plt.subplot(1, 2, 1)
# 使用默认设置画出余弦曲线
plt.plot(X, C)
# 使用默认设置画出正弦曲线
plt.plot(X, S)

plt.subplot(1, 2, 2)
# 移动坐标轴边线
# 坐标轴总共有四个连线,我们通过设置透明色隐藏上方和右方的边线
# 通过 set_position() 移动左侧和下侧的边线
# 通过 set_ticks_position() 设置坐标轴的刻度线的显示位置
ax = plt.gca() # gca 代表当前坐标轴,即 'get current axis'
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))
# 设置坐标刻度的字体大小,增加半透明背景
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(16)
label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))

# 设置坐标轴的长度
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)

# 设置坐标轴的刻度和标签
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi),
label=(r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$'))
plt.yticks([-1, -0.5, 0, 0.5, 1])


# 画出余弦曲线,并设置线条颜色,宽度,样式
plt.plot(X, C, color="blue", linewidth=2.0, linestyle="-",label='cos(x)')
# 画出正弦曲线,并设置线条颜色,宽度,样式
plt.plot(X, S, color="red", linewidth=2.0, linestyle="-",label='sin(x)')

# 在左上角添加铭牌
plt.legend(loc='upper left')

# 在坐标轴上标示相应的点
t = 2 * np.pi / 3
# 画出 cos(t) 所在的点在 X 轴上的位置,即画出 (t, 0) -> (t, cos(t)) 线段,使用虚线
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=1.5, linestyle="--")
# 画出标示的坐标点,即在 (t, cos(t)) 处画一个大小为 50 的蓝色点
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
# 画出标示点的值,即 cos(t) 的值
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"))
# 画出 sin(t) 所在的点在 X 轴上的位置,即画出 (t, 0) -> (t, sin(t)) 线段,使用虚线
plt.plot([t, t],[0, np.sin(t)], color='red', linewidth=1.5, linestyle="--")
# 画出标示的坐标点,即在 (t, sin(t)) 处画一个大小为 50 的红色点
plt.scatter([t, ],[np.sin(t), ], 50, color='red')
# 画出标示点的值,即 sin(t) 的值
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.show()

Scatter基础用法

import numpy as np
import matplotlib.pyplot as plt

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

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()

覆盖函数

n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)

plt.plot(X,Y+1,color='b',alpha=0.5)
plt.fill_between(X,1,Y+1,color='blue',alpha=1.00)

plt.plot(X,Y-1,color='b',alpha=0.5)
plt.fill_between(X,-1,Y-1,(Y-1)>-1,color='blue',alpha=.25)
plt.fill_between(X,-1,Y-1,(Y-1)<-1,color='red',alpha=.25)

plt.show()

Contour :简易上手教

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

生成一个简单的带lable的contour图(线图)使用默认的颜色。clabel 中的 inline 语法控制着是否这个label是画在线上面,如果画在线里面这需要控制字体与线之间的距离,inline = 0 代表线与文字共存。

fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z)
ax.clabel(CS, inline=1, fontsize=10)
ax.set_title('Simplest default with labels')

除此以外,还可以控制label的位置,手工位置:manual_location

fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z)
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)]
ax.clabel(CS, inline=1, fontsize=10, manual=manual_locations)
ax.set_title('labels at selected locations')

还可以控制线的个数,这里感觉好像是100-1=99

fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z,100)
ax.set_title('Simplest default with labels')
fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z,12,colors = 'k')
ax.clabel(CS, inline=1, fontsize=10)
ax.set_title('Simplest default with labels')

contourf :填充等高线图

def plt_contour():
def f(x,y):
return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)

plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)

plt.xticks(())
plt.yticks(())

plt_contour()

解决中文显示&负号显示问题

plt.rcParams['font.sans-serif']=['SimHei']    # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

参考文档:http://www.mamicode.com/info-detail-2693409.html

可能出现的问题:

UserWarning: findfont: Font family [u'Times New Roman'] not found.

解决方案:

  1. 下载字体

    字体下载网站:http://www.font5.com.cn/font_download.php?id=151&part=1237887120

  2. 将下载的字体文件(.tff)文件,拷贝到matplot下的字体目录下

    # 字体存放文件夹
    import matplotlib
    print(matplotlib.matplotlib_fname())
  3. 清理原先的字体缓存文件夹

    # 字体缓存文件夹在
    import matplotlib as mpl
    fm = mpl.font_manager
    fm.get_cachedir()

    找到文件后,删除

    rm -rf 这里填上一步中找到的文件夹路径
  4. 重启Python内核

  5. 在代码中加入代码:

    plt.rcParams['font.sans-serif']=['SimHei']    # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

    或者修改matplotlibrc文件

    font.family         : sans-serif 
    ...
    font.sans-serif : SimHei
    ...
    axes.unicode_minus : False # use unicode for the minus symbol

把图表中所有的内容设置为Times New Roman 格式

  • 代码参考:
plt.figure(figsize=(10, 5))
plt.plot(top_stock, c='b', label="前{}支股票的涨幅均值".format(top_num))
plt.plot(mean, c='k', label='所有股票的涨幅均值')
plt.legend(prop={'family': 'SimHei', 'size': 12}, loc='best') # 设置标签
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.yticks(rotation=45, fontproperties='Times New Roman', size=14) # 还可以设置字体旋转
plt.xticks(fontproperties='Times New Roman', size=14) # 调整坐标轴的大小和字体格式
plt.ylabel('Price Vibration', fontdict={'family': 'Times New Roman', 'size': 16}) # 设置横纵坐标的名称
plt.xlabel('Time', fontdict={'family': 'Times New Roman', 'size': 16})
plt.show()