python可视化

创建多维窗口
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值