Matplotlib & Seaborn基础


 另一篇关于Matplotlib & Seaborn的总结。

1 Matplotlib

1.1 通过Figure()创建画布

import numpy as np
import matplotlib.pyplot as plt

# 1.1通过Figure()创建画布
fig = plt.figure()
data = np.arange(200,305)
plt.figure(facecolor = 'gray')
plt.plot(data)
plt.savefig('1.png')
plt.show()

1.2 通过subplot()函数创建单个子图

# 1.2通过subplot()函数创建单个子图
nums = np.arange(0,101)
plt.subplot(221)
plt.plot(nums, nums)
plt.subplot(222)
plt.plot(nums, -nums)
plt.subplot(212)
plt.plot(nums, nums**2)
plt.savefig('2.png')
plt.show()

1.3 通过subplot()函数创建多个子图

# 1.3通过subplot()函数创建多个子图
nums = np.arange(1,101)
# 生成2*2的矩阵区域,返回子图数组axes
fig , axes = plt.subplots(2,2)
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
# 在选中的子图上作图
ax1.plot(nums, nums)
ax2.plot(nums, -nums)
ax3.plot(nums, nums**2)
ax4.plot(nums, np.log(nums))
plt.savefig('1-3.png')
plt.show()

1.4 通过add_subplot()方法添加和选中子图

# 1.4
fig = plt.figure()
# 添加子图
fig.add_subplot(2,2,1)
fig.add_subplot(2,2,2)
fig.add_subplot(2,2,4)
fig.add_subplot(2,2,3)

random_arr = np.random.randn(100)
# 默认在最后一次使用subplot的位置上作图,即编号为3的子图
plt.plot(random_arr)
plt.savefig('1-4.png')
plt.show()

1.5 添加各类标签

# 1.5
data = np.arange(0, 1.1, 0.01)
plt.title("Plot") # 添加标题
plt.xlabel("x") # 添加x轴名称
plt.ylabel("y") # 添加y轴名称
# 添加x轴和y轴的刻度
plt.xticks([0,0.5,1])
plt.yticks([0, 0.5, 1.0])
plt.plot(data, data**2)
plt.plot(data, data**3)
plt.legend(["y=x^2", "y=x^3"]) # 添加图例
plt.savefig('1-5.png')
plt.show()

1.6 绘制常见类型图表

# 1.6
arr = np.random.randn(100)
plt.hist(arr, bins = 8, color = 'r', alpha = 0.7) # 绘制直方图
plt.savefig('1-6.png')
plt.show()

x = np.arange(50)
y = np.random.randn(50) * 10
plt.scatter(x, y)
plt.savefig('1-6-1.png')
plt.show()

x = np.arange(5)

y1, y2 = np.random.randint(1, 31, size=(2,5))
width = 0.25 # 条形宽度
ax = plt.subplot(1 ,1 ,1)
ax.bar(x, y1, width, color = 'r') # 绘制红色的柱状图
ax.bar(x+width, y2, width, color = 'g') # 绘制另一个绿色的柱状图
ax.set_xticks(x + width) # 设置x轴的刻度

ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr' ,'May'])
plt.savefig('1-6-2.png')
plt.show()

data = np.arange(1, 3, 0.3)
# 绘制直线,青色,标记为x,线型为长虚线
plt.plot(data, color = "c", marker="x", linestyle="--")
# 绘制直线,品红,标记为实心圆圈,线型为短虚线
plt.plot(data+1, color = "m", marker="o", linestyle=":")
# 绘制直线,黑色,标记为五边形,线型为短点相间线
plt.plot(data+2, color = "k", marker="p", linestyle="-.")
# plt.plot(data, 'cx--', data+1, 'mo:', data+2, 'kp-.')
plt.savefig('1-6-3.png')
plt.show()

2 Seaborn

2.1 可视化数据的分布

import seaborn as sns
import numpy as np 
sns.set() # 显式调用set()获取默认绘图
np.random.seed(0) # 确定随机数生成器的种子
arr = np.random.randn(100) # 生成随机数组
ax = sns.distplot(arr, bins = 10) # 绘制直方图
plt.savefig('2-1.png')

array_random = np.random.randint(0, 100, 500)
# 绘制核密度估计曲线
sns.distplot(array_random, hist=False,rug = True)
plt.savefig('2-2.png')

import pandas as pd
data = pd.DataFrame({"x": np.random.randn(500), "y":np.random.randn(500)})

# 绘制散布图
sns.jointplot(x = "x", y = "y", data = data)
plt.savefig('2-3.png')

# 绘制二维直方图
sns.jointplot(x = "x", y = "y", data = data,kind = "hex")
plt.savefig('2-4.png')

# 核密度估计
sns.jointplot(x="x", y = "y", data = data,kind = "kde")
plt.savefig('2-5.png')

常见概率分布的Matplotlib实现

 本次实验所用的4种常见分布,连续分布的代表:beta分布、正态分布,均匀分布,离散分布的代表:二项分布。

import numpy as np
from scipy.stats import beta, norm, uniform, binom
import matplotlib.pyplot as plt
from functools import wraps
# 定义带四个参数的画图装饰器
def my_plot(label0=None,
            label1=None,
            ylabel='probability density function',
            fn=None):
    def decorate(f):
        @wraps(f)
        def myplot():
            fig = plt.figure(figsize=(16, 9))
            ax = fig.add_subplot(111)
            x, y, y1 = f()
            ax.plot(x, y, linewidth=2, c='r', label=label0)
            ax.plot(x, y1, linewidth=2, c='b', label=label1)
            ax.legend()
            plt.ylabel(ylabel)
            plt.show()
            plt.savefig('img/%s' % (fn, ))
            plt.close()

        return myplot

    return decorate
# 定义带四个参数的画图装饰器
def my_plot(label0=None,
            label1=None,
            ylabel='probability density function',
            fn=None):
    def decorate(f):
        @wraps(f)
        def myplot():
            fig = plt.figure(figsize=(16, 9))
            ax = fig.add_subplot(111)
            x, y, y1 = f()
            ax.plot(x, y, linewidth=2, c='r', label=label0)
            ax.plot(x, y1, linewidth=2, c='b', label=label1)
            ax.legend()
            plt.ylabel(ylabel)
            plt.savefig('img/%s' % (fn, ))
            plt.show()

            plt.close()

        return myplot

    return decorate

均匀分布

@my_plot(label0='b-a=1.0', label1='b-a=2.0', fn='uniform.png')
def unif():
    x = np.arange(-0.01, 2.01, 0.01)
    y = uniform.pdf(x, loc=0.0, scale=1.0)
    y1 = uniform.pdf(x, loc=0.0, scale=2.0)
    return x, y, y1

二项分布

@my_plot(
    label0='n=50,p=0.3',
    label1='n=50,p=0.7',
    fn='binom.png',
    ylabel='probability mass function')
def bino():
    x = np.arange(50)
    n, p, p1 = 50, 0.3, 0.7
    y = binom.pmf(x, n=n, p=p)
    y1 = binom.pmf(x, n=n, p=p1)
    return x, y, y1

高斯分布

@my_plot(label0='u=0.,sigma=1.0', label1='u=0.,sigma=2.0', fn='guass.png')
def guass():
    x = np.arange(-5, 5, 0.1)
    y = norm.pdf(x, loc=0.0, scale=1.0)
    y1 = norm.pdf(x, loc=0., scale=2.0)
    return x, y, y1

Beta分布

@my_plot(label0='a=10., b=30.', label1='a=4., b=4.', fn='beta.png')
def bet():
    x = np.arange(-0.1, 1, 0.001)
    y = beta.pdf(x, a=10., b=30.)
    y1 = beta.pdf(x, a=4., b=4.)
    return x, y, y1

绘制所有四种分布

【均匀分布、二项分布、高斯分布、beta分布】

distrs = [unif, bino, guass, bet]
for distri in distrs:
    distri()

文章作者: HANABI
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HANABI !
评论
  目录