创建多维窗口:
fig,axes = plt.subplots(23):表示一次性在figure上创建2*3的网格,使用plt.subplot()只能一个一个的添加(plt.subplots(行,列))
import matplotlib.pyplot as plt
# 创建画图fig和axes
def setup_axes():
fig, axes = plt.subplots(ncols=3, figsize=(6.5,3))
for ax in fig.axes:
ax.set(xticks=[], yticks=[])
fig.subplots_adjust(wspace=0, left=0, right=0.93)
return fig, axes
**栗子:**
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
fig, axes = setup_axes()
axes[0].plot(x,2*x)
axes[1].bar(0.2*x,0.5*x+1)
axes[2].scatter(0.11*x,0.45*x+0.3)
plt.show()
# **图片标题**
def title(fig, text, y=0.9):
fig.suptitle(text, size=14, y=y, weight='semibold', x=0.98, ha='right',bbox=dict(boxstyle='round', fc='floralwhite', ec='#8B7E66',lw=2),fontproperties=myfont)
# **为数据添加文本注释**
def label(ax, text, y=0):
ax.annotate(text, xy=(0.5, 0.00), xycoords='axes fraction', ha='center',
style='italic',
bbox=dict(boxstyle='round', facecolor='floralwhite',
ec='#8B7E66'))
基本绘图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
myfont = mpl.font_manager.FontProperties(fname=r"/Users/Anne/Downloads/weuruan 2/msyh.ttf") #fname指定字体文件 选简体显示中文
#为了消除更换为unicode字体之后0、负数之类的显示异常。之后所有使用中文字体的地方只字符串都以u""的形式出现,并指定fontproperties属性为我们的指定的myfont就行了
mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = ['SimHei']
x = np.linspace(0, 10, 100)
fig, axes = setup_axes()
for ax in axes:
ax.margins(y=0.10)
# 子图1 默认plot多条线,颜色系统分配
for i in range(1, 6):
'''
axes[0].plot(x,2*x)
'''
axes[0].plot(x, i * x)
# 子图2 展示线的不同linestyle
for i, ls in enumerate(['-', '--', ':', '-.']):
axes[1].plot(x, np.cos(x) + i, linestyle=ls)
# 子图3 展示线的不同linestyle和marker
for i, (ls, mk) in enumerate(zip(['', '-', ':'], ['o', '^', 's'])):
axes[2].plot(x, np.cos(x) + i * x, linestyle=ls, marker=mk, markevery=10)
# 设置标题
title(fig, 'w自定义表名', y=1.2)
# 保存图片
fig.savefig('plot_example.png', facecolor='none')
# 展示图片
plt.show()
显示中文部分请自行下载字体,我的如下:
macbook的中文字体下载链接:
http://www.pc6.com/pc/macword/
散点图:
import numpy as np
import matplotlib.pyplot as plt
myfont = mpl.font_manager.FontProperties(fname=r"/Users/Anne/Downloads/weuruan 2/msyh.ttf") #fname指定字体文件 选简体显示中文
#第七行的作用是为了消除更换为unicode字体之后0、负数之类的显示异常。之后所有使用中文字体的地方只字符串都以u""的形式出现,并指定fontproperties属性为我们的指定的myfont就行了
mpl.rcParams['axes.unicode_minus'] = False
mpl.rcParams['font.sans-serif'] = ['SimHei']
np.random.seed(1874)
x,y,z = np.random.normal(0,1,(3,100))
t = np.arctan2(y,x)
size = 50*np.cos(2*t)**2 + 10
fig,axes =setup_axes()
axes[0].scatter(x,y,marker = 'o',color = 'darkblue',facecolor ='white',s=80)
label(axes[1],'scatter(x,y)')
axes[1].scatter(x,y,marker='s',color='darkblue',s=size)
label(axes[1],'scatter(x,y,s)')
axes[2].scatter(x,y,s=size,c=z,cmap='gist_ncar')
label(axes[2],'scatter(x,y,s,c)')
title(fig,'自定义图表',y=1.05)
fig.savefig('scatter_example.png', facecolor='none')
plt.show()
数据分布图:
#数据分布图
import numpy as np
import matplotlib.pyplot as plt
def main():
colors = ['cyan','red','blue','green','purple']
dists = generate_data()
fig,axes = setup_axes()
hist(axes[0],dists,colors)
boxplot(axes[1],dists,colors)
violinplot(axes[2],dists,colors)
title(fig,'自定义图表',y=0.99)
fig.savefig('statistical_example.png',facecolor='none')
plt.show()
def generate_data():
means = [0-1,2.5,4.3,-3.6]
sigmas = [1.2,5,3,1.5,2]
nums = [150,1000,100,200,500]
dists = [np.random.normal(*args) for args in zip(means,sigmas ,nums)]
return dists
def hist(ax,dists,colors):
#ax.set_color_cycle(colors)
for dist in dists:
ax.hist(dist,bins=20,density=True,edgecolor='none',alpha=0.5)
ax.margins(y=0.05)
ax.set_ylim(bottom=0)
label(ax,'ax.hist(dist)')
#箱型图
def boxplot(ax, dists, colors):
result = ax.boxplot(dists, patch_artist=True, notch=True, vert=False)
for box, color in zip(result['boxes'], colors):
box.set(facecolor=color, alpha=0.5)
for item in ['whiskers', 'caps', 'medians']:
plt.setp(result[item], color='gray', linewidth=1.5)
plt.setp(result['fliers'], markeredgecolor='gray', markeredgewidth=1.5)
plt.setp(result['medians'], color='black')
ax.margins(0.05)
ax.set(yticks=[], ylim=[0, 6])
label(ax, 'ax.boxplot(dists)')
#小提琴图
def violinplot(ax, dists, colors):
result = ax.violinplot(dists, vert=False, showmedians=True)
for body, color in zip(result['bodies'], colors):
body.set(facecolor=color, alpha=0.5)
for item in ['cbars', 'cmaxes', 'cmins', 'cmedians']:
plt.setp(result[item], edgecolor='gray', linewidth=1.5)
plt.setp(result['cmedians'], edgecolor='black')
ax.margins(0.05)
ax.set(ylim=[0, 6])
label(ax, 'ax.violinplot(dists)')
main()
python中的np.random.normal(*args):
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数的意义为:
loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
我们更经常会用到的np.random.randn(size)所谓标准正态分布(μ=0,σ=1),对应于np.random.normal(loc=0, scale=1, size)。
柱状图:
import numpy as np
import matplotlib.pyplot as plt
def main():
fig, axes = setup_axes()
basic_bar(axes[0])
tornado(axes[1])
general(axes[2])
title(fig, '自定义图名')
fig.savefig('bar_example.png', facecolor='none')
plt.show()
# 子图1
def basic_bar(ax):
y = [1, 3, 4, 5.5, 3, 2]
err = [0.2, 1, 2.5, 1, 1, 0.5]
x = np.arange(len(y))
ax.bar(x, y, yerr=err, color='lightblue', ecolor='black')
ax.margins(0.05)
ax.set_ylim(bottom=0)
label(ax, 'bar(x, y, yerr=e)')
# 子图2
def tornado(ax):
y = np.arange(8)
x1 = y + np.random.random(8) + 1
x2 = y + 3 * np.random.random(8) + 1
ax.barh(y, x1, color='lightblue')
ax.barh(y, -x2, color='salmon')
ax.margins(0.15)
label(ax, 'barh(x, y)')
# 子图3
def general(ax):
num = 10
left = np.random.randint(0, 10, num)
bottom = np.random.randint(0, 10, num)
width = np.random.random(num) + 0.5
height = np.random.random(num) + 0.5
ax.bar(left, height, width, bottom, color='salmon')
ax.margins(0.15)
label(ax, 'bar(l, h, w, b)')
main()