• TASK05|GITMODEL数据可视化plotnine


    数据可视化可以使用d3js和echarts,doris

    plotly和pyecharts
    在python可以使用seaborn,matplotlib,plotnine可视化包
    R语言的ggplot2包


    什么是数据可视化
    python三大数据可视化工具库的简介:Matplotlib、Seaborn和Plotnine
    Matplotlib绘图基础
    Plotnine绘图基础
    基本图表的Quick Start
    Plotnine和Matplotlib进阶画图
    如何选择合适的图表正确表达数据
    数据可视化案例:使用Plotnine绘制元素周期表

    plotnine

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.rcParams['font.sans-serif']=['SimHei','Songti SC','STFangsong']
    plt.rcParams['axes.unicode_minus']=False
    #用来正常显示负号
    import seaborn as sns
    
    df=pd.DataFrame({'variable':['gender','gender','age','age','income','income','income','income'],
    'catogory':['Female','Male','1-24','25-24','55+','Lo','Lo-Med','Med','High'],
    'value':[60,40,50,30,20,10,25,25,40],})
    
    df['variable']=pd.Categorical(df['variable'],categories=['gender','age','income'])
    
    df['category']=pd.Categorial(df['category'],categories=df['category'])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    #堆叠柱状图
    from plotnine import *
    (
    ggplot(df,aes(x='variable',y='value',fill='category'))+geom_col()
    )
    # 柱状图
    from plotnine import *
    (
    ggplot(df,aes(x='variable',y='value',fill='category'))+gem_col(stat='identity',position='dodge')
    )
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    matplotlib

    创建一个图形对象,并设置图形对象的大小(可以想象成在白纸中添加一个图,并设置图的大小):plt.figure(figsize=(6,4))
    在纸上的坐标系中绘制散点:plt.scatter(x=x, y=y)
    设置x轴的标签label:plt.xlabel(‘x’)
    设置y轴标签的label:plt.ylabel(‘y’)
    设置图表的标题:plt.title(‘y = sin(x)’)
    展示图标:plt.show()

    plt.legend()

    x=np.linspace(-2*np.pi,2*np.pi,100)
    y=np.sin(x)
    array = numpy.linspace(start, end, num=num_points)
    #将在start和end之间生成一个统一的序列,共有num_points个元素。
    
    • 1
    • 2
    • 3
    • 4

    import matplotlib.pyplot as plt
    plt.figure(figsize=(8,6))
    plt.scatter(x=x, y=y)
    plt.xlabel(‘x’)
    plt.ylabel(‘y’)
    plt.title(‘y = sin(x)’)
    plt.show()

    【例子】绘制y = sin(x) 和 y=cos(x)的散点图:

    • 创建第一个绘图对象
      • 在纸上的坐标系中绘制散点:plt.scatter(x=x, y=sin(x))
      • 设置x轴的标签label:plt.xlabel(‘x’)
      • 设置y轴标签的label:plt.ylabel(‘y’)
      • 设置图表的标题:plt.title(‘y = sin(x)’)
    • 创建第二个绘图对象:
      • 在纸上的坐标系中绘制散点:plt.scatter(x=x, y=cos(x))
      • 设置x轴的标签label:plt.xlabel(‘x’)
      • 设置y轴标签的label:plt.ylabel(‘y’)
      • 设置图表的标题:plt.title(‘y = cos(x)’)
    x=np.linspace()-2*np.pi,2+np.pi,100)
    y1=np.sin(x)
    y2=np.cos(x)
    #绘制第一个图
    fig1=plt.figure(figsize=
    (6,4),num='first')
    fig1.suptitle('y=sin(x)')
    plt.scatter(x=x,y=y1)
    plt.xlabel('x')
    plt.ylabel('y')
    
    #绘制第二个图
    fig2=plt.figure(figsize=(6,4),num='second')
    fig2.suptitle('y=cos(x)')
    plt.scatter(x=x,y=y2)
    plt.xlabel('x')
    plt.ylabel('y')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    seaborn

    x=np.linspace(-10,10,100)
    y=2*x+1+np.random.randn(100)
    df=pd.DataFrame({'x':x,'y':y})
    
    #使用matplotlib绘制带有拟合直线效果的散点图
    func=np.polyfit(x,y,1)#拟合直线
    poly=np.poly1d(func)#设置拟合直线
    y_pred=poly(x)#预测
    plt.scatter(x,y)#绘制点图
    plt.plot(x.y_pred)#绘制拟合直线图
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()
    
    #使用seaborn绘制带有拟合直线效果的散点图
    sns.lmplot("x","y",data=df)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    plotnine

    from plotnine improt *
    from plotnine.data import *
    mpg.head()
    
    • 1
    • 2
    • 3

    mpg数据集记录了美国1999年和2008年部分汽车的制造厂商,型号,类别,驱动程序和耗油量。

    • manufacturer 生产厂家
    • model 型号类型
    • year 生产年份
    • cty 和 hwy分别记录城市和高速公路驾驶耗油量
    • cyl 气缸数
    • displ 表示发动机排量
    • drv 表示驱动系统:前轮驱动、(f),后轮驱动®和四轮驱动(4)
    • class 表示车辆类型,如双座汽车,suv,小型汽车
    • fl (fuel type),燃料类型
    # 绘制汽车在不同驱动系统下,发动机排量与耗油量的关系
    p1=(
    ggplot(mpg,aes(x=''displ),y='hwy',color='drv'))+geom_point()#绘制散点图图层
    +geom_smooth(method='lm')#绘制平滑线图层
    +labs(x='displacement',y='horsepower')  # 绘制x、y标签图层
    
    )
    print(p1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Plotnine没有实现除了直角坐标以外的坐标体系
    Matplotlib具有ggplot风格,可以通过设置ggplot风格绘制具有ggplot风格的图表。
    plt.style.use("ggplot") #风格使用ggplot

    matplotlib绘图基础

    Matplotlib 图表的组成元素包括: 图形 (figure)、坐标图形 (axes)、图名 (title)、图例 (legend)、 主要刻度 (major tick)、次要刻度 (minor tick)、主要刻度标签(major tick label)、次要刻度标签 (minor tick label)、 Y轴名 (Y axis label)、X轴名 ( X axis label)、边框图 (line)、数据标记 (markers)、网格 (grid) 线等
    在这里插入图片描述
    Mayplotlib绘图元素包括:基本绘图类型与容器绘图类型
    (1)基本绘图类型(graphic primitives):点 (marker)、线 (line)、文本 (text)、图例 (legend)、网格线 (grid)、 标题 (title)、图片 (image) 等;

    (2)容器绘图类型(containers):

    Figure:最重要的元素,代表整个图像,所有的其他元素都是绘制在其上(如果有多个子图,子图也绘制在figure上)。Figure 对象包含一些特殊的 artist 对象,如图名 (title)、图例 (legend)。
    Axes:第二重要的元素,代表 subplot(子图),数据都是显示在这个区域。一个Figure至少含有一个Axes对象,当绘制多个子图时
    Axis:代表坐标轴对象,本质是一种带装饰的 spines,一般分为 xaxis 和 yaxis,Axis对象主要用于控制数据轴上的刻度位置和显示数值。
    Spines:表示数据显示区域的边界,可以显示或不显示。
    Artist:表示任何显示在 Figure 上的元素,Artist 是很通用的概念,几乎任何需要绘制的元素都可以当成是 Artist,但是一个 Artist 只能存在于一个 Axes 之上

    在这里插入图片描述

    plt.figure(figsize=(6,3), dpi=75)#设置图表的大小figsize与分辨率dpi
    plt.title('这是一个标题')
     plt.xlabel("这是x轴标签")/plt.ylabel("这是y轴标签")
    plt.axis(xmin=0, xmax=1, ymin=0.5)#设置x轴和y轴的显示范围 |plt.xlim(0,1)/plt.ylim(0,1)
    plt.xticks(labels=['A', 'B', 'C', 'D'])/plt.yticks(list(np.arange(11))#设置x轴和y轴的刻度数值
    grid()#设置网格线
    plt.grid(b=True, which='both', axis='y')
    # b: 是否显示网格线 True/None;
    # which: 网格线显示的尺度。字符串,可选参数,取值范围为{'major', 'minor', 'both'},
    #默认为'both'。'major'为主刻度、'minor'为次刻度。
    # axis: 选择网格线显示的轴。字符串,可选参数,取值范围为{'both', 'x', 'y'},默认为'both'`。
    # | | legend() | 设置图表的图例 | plt.legend("这是一个图例", loc='best')
    # loc表示图例的位置,可选:0-'best', 1-'upper right',2-'upper left',3-'lower left',4-'lower right',5-'right',6-'center left',7-'center right',
    # 8-'lower center',9-'upper center',10-'center' |
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    创建一个figure,figure的大小figsize为(12,10);
    在figure中创建两个Axes子图;
    在每个Axes子图中分别绘制y=sin(x)和y=cos(x)图像,并添加title、xlabel、ylabel、axis、grid、和legend

    x=np.linspace(-2*np.pi,2*np.pi,100)
    y1=np.sin(x)
    y2=np.cos(x)
    #开始绘图
    fig=plt.figure(figsize=(16,6))
    ax1=fig.add_axes([0.1,0.1,0.4,0.8])
    
    plt.scatter(x=x, y=y1, label=r"$y=sin(x)$")   # 在axes1中绘制y=sin(x)散点图, label是为了legend能够知道是哪个绘图的图例
    plt.title("y = sin(x)")   # 在axes1设置标题
    plt.xlabel("x")    # 在axes1中设置x标签
    plt.ylabel("y")    # 在axes1中设置y标签
    plt.axis(xmin=-2*np.pi, xmax=2*np.pi, ymin=-1, ymax=1)  # 在axes1中设置x轴和y轴显示范围
    plt.xticks(
        ticks=[-2*np.pi, -3/2*np.pi, -np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi, 3/2*np.pi, 2*np.pi], 
        labels=[r'$-2 \pi$', r'$-\frac{3 \pi}{2}$', r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3 \pi}{2}$', r'$2\pi$']
        )   # 在axes1中设置x轴刻度的值,ticks代表在哪个位置修改,labels代表修改的具体值是多少
    plt.grid(b=True, which='both')  # 在axes1中设置设置网格线
    plt.legend(loc=1)  
     ax2 = fig.add_axes([0.6,0.1,0.4,0.8])  # [left, bottom, width, height], 它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度
    plt.scatter(x=x, y=y2, label=r"$y=cos(x)$")   # 在axes2中绘制y=cos(x)散点图,label是为了legend能够知道是哪个绘图的图例
    plt.title("y = cos(x)")  # 在axes2设置标题
    plt.xlabel("x")     # 在axes2中设置x轴标签
    plt.ylabel("y")    # 在axes2中设置y标签
    plt.axis(xmin=-2*np.pi, xmax=2*np.pi, ymin=-1, ymax=1)   # 在axes2中设置x轴和y轴显示范围
    plt.xticks(
        ticks=[-2*np.pi, -3/2*np.pi, -np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi, 3/2*np.pi, 2*np.pi], 
        labels=[r'$-2 \pi$', r'$-\frac{3 \pi}{2}$', r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3 \pi}{2}$', r'$2\pi$']
        )  # 在axes2中设置x轴刻度的值,ticks代表在哪个位置修改,labels代表修改的具体值是多少
    plt.grid(b=True, which='both')   # 在axes2中设置设置网格线
    plt.legend(loc=1)   # 在axes2中设置图例
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4.Plotnine绘图基础

    Plotnine中的图层可以分为:必备图层和可选图层

    (1)必备图层:ggplot()图层与geom_xxx()/stat_xxx()图层

    • ggplot()图层 底层绘图函数
      ggplot(data, aes(x=‘col_x’, y=‘y_value’, fill=‘col_class’))
      设置变量的映射aes(),用来表示x和y,还可以在aes()内控制颜色color、大小size和形状shape

    • geom_xxx()图层:几何对象
      散点图geom_point()、柱状图geom_bar()、折线图geom_line()、直方图geom_histogram()

    • stat_xxx()图层。根据图层函数输入的变量个数和输入变量的数据类型(涉及复杂的统计变换)

    在这里插入图片描述

    x = np.linspace(-2*np.pi, 2*np.pi, 100)
    y = np.sin(x)
    y_label = np.random.choice(['1','2','3'], 100)
    data = pd.DataFrame({'x':x, 'y':y, 'label':y_label})
    # 绘制散点图geom_point()
    p1 = (
        ggplot(data, aes(x='x', y='y', fill='y_label', size='y', shape='y_label'))+
        geom_point()
    )
    print(p1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (2)可选图层

    scale_xxx()、facet_xxx()、guides_xxx()、coord_xxx()以及theme()

    • scale_xxx()图层:标度(scale)是用于调整数据映射的图形属性,scale_xxx()获取数据并对其进行调整以适应视觉的不同方面,即长度、颜色、大小和形状等
      scale_xxx()的基本格式为:scale_映射类型_数据类型()。其中,映射类型包括:xy轴,size, color(颜色), fill(填充颜色), shape, alpha(透明度), linetype;数据类型包括:连续型continuous,离散型discrete,自定义manual,同一型identity。

    在这里插入图片描述
    在这里插入图片描述

    p1=(
    ggplot(mpg,aes(x='displ', y='hwy', color='drv', shape='drv'))
     + geom_point()       # 绘制散点图图层
        + labs(x='displacement', y='horsepower')     # 绘制x、y标签图层
        + scale_shape_manual(values=('o', 's', '*'))  # 添加shape映射美化
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    直角坐标系的类型,分面图层

    p1=(ggplot(mpg,aes(x='displ', y='hwy', color='drv') +geom_point()
       + labs(x='displacement', y='horsepower')     # 绘制x、y标签图层
        + facet_grid('.~ class', labeller='label_value') # 按照车辆类型分面))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    数据可视化的图表分为以下类别:

    • 类别型图表
    • 关系型图表
    • 数据分布型图表
    • 时间序列型图表
    • 空间分布型图表

    (1)类别型图表:

    类别型图表一般表现为:X类别下Y数值之间的比较,因此类别型图表往往包括:X为类别型数据、Y为数值型数据。类别型图表常常有:柱状图、横向柱状图(条形图)、堆叠柱状图、极坐标的柱状图、词云、雷达图、桑基图等等。

    (2)关系型图表:

    关系型图表一般表现为:X数值与Y数值之间的关系,如:是否是线性关系、是否有正向相关关系等等。一般来说,关系可以分为:数值型关系、层次型关系和网络型关系。

    • 数值型关系:主要展示两个变量或者多个变量之间的数值关系,如:最简单的散点图、气泡图、相关系数矩阵图、等高线图、曲面图等等。
    • 层次型关系:主要展示数据个体(样本)之间的层次关系,有从属关系和包含关系两种。从属关系顾名思义如:不同职位之间的上下属关系,如最简单的树状图;包含关系如:欧洲不同的足球联赛的队伍包含关系,不同洲的国家包含关系等等,如:韦恩图、弧长链接图、圆填充图、旭日图等等。
    • 网络型关系:常常值个体之间有联系,但并不是相互包含或者从属关系,如:微信中的朋友的关系网络。网络型关系的图表一般有:和弦图、桑基图、网络图等等。

    (3)数据分布型图表:

    分布这个词在概率论和数理统计中出现,分布常常指数据以及出现的频率,常见的图表有:频次直方图、频率直方图、核密度图、箱线图、提琴图等等。

    (4)时间序列型图表:

    时间序列型图表主要描述了数据沿着之间变化而变化的规律,一般来说横轴是时间,纵轴是数值或者类别型数据。常见的图表有折线图、日历图、甘特图等等。

    (5)空间分布型图表:

    空间分布顾名思义,主要描述了某个数值型/类别型数据随着空间位置变化的规律,如:地图散点图、地图气泡图、地图热力图等等。

    下面,我们来详细学习每一种图表的绘制过程:

    
    
    • 1

    使用np.polyfit和np.poly1d进行拟合

    x = np![在这里插入图片描述](https://img-blog.csdnimg.cn/6c1b90ee2c574a6fa2fc65d5e89c330f.png)
    .array([4, 8, 10, 12, 25, 32, 43, 58, 63, 69, 79])
    y = np.array([20, 33, 50, 56, 42, 31, 33, 46, 65, 75, 78])
    
    figure1 = plt.figure(figsize=(8, 6))
    # coeff 为系数,poly_fit 拟合函数
    # 1. 先拟合获取系数
    coeff_1 = np.polyfit(x, y, 1)#在这里修改你和的阶数
    print("一阶拟合系数为:", coeff_1)
    # 2. 根据系数得到多项式
    poly_fit_1 = np.poly1d(coeff_1)
    print("一阶多项式为:", poly_fit_1)
    # 3. 输入变量(单个值或者变量数组),得到拟合结果(数组)
    y_fit_1 = poly_fit_1(x)
    print("拟合得到的数据为L", y_fit_1)
    # 4. 根据结果作图
    plt.plot(x, y_fit_1, 'green',label="一阶拟合")
    # 5. 根据原始数据以及拟合数据得到拟合优度
    rr1 = goodness_of_fit(y_fit_1, y)
    print("拟合优度为%.5f" % rr1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    np.ployfit使用最小二乘法进行多项式拟合
    numpy.polyfit(x,y,deg,rcond = None,full = False,w = None,cov = False )
    参数:
    x: 类数组,形状(M,),表示M个采样点的x坐标
    y: 类似array_,形状为(M,)或(M,K), 表示采样点的y坐标。通过传递每列包含一个数据集的2D数组,可以一次拟合多个共享相同x坐标的采样点数据集
    deg: 度:整数, 表示拟合多项式的度
    cov: cov:布尔值,可选。返回估算值和估算值的协方差矩阵。如果full为True,则不返回cov
    np.poly1d
    如果f(x) = 2x2 +x +1
    a= np.array([2,1,1])
    p = np.poly1d(a)

    numpy.poly1d(c_or_r,r = False,变量= None )
    参数:
    c_or_r: 数组array,代表多项式的系数,以幂次递减,或者如果第二个参数的值为True,则为多项式的根(多项式求值为0的值)。
    r bool(可选): 如果为True,则c_or_r指定多项式的根。默认值为False。
    可变str(可选): 将打印p时使用的变量从x更改为variable 。
    返回值: 相应的多项式

    多项式对象的deriv( )和integ( )方法分别用于计算多项式函数的微分和积分
    p.deriv() #微分
    p.integ() #积分
    多项式函数的根可以用roots( )计算:
    np.roots(p)

    除了使用多项式对象外,还可以直接使用Numpy提供的多项式函数对多项式系数的数组进行运算,主要函数包括:np.poly, np.polyadd, np.polydiv, np.polyint, np.polysub, np.poly1d, np.polyder, np.polyfit, np.polymul, np.polyval等。


    1、np.poly1d()此函数有两个参数:

    参数1:为一个数组,若没有参数2,则生成一个多项式,例如:

    p = np.poly1d([2,3,5,7])

    print§ ==>>2x3 + 3x2 + 5x + 7 数组中的数值为coefficient(系数),从后往前 0,1,2.。。为位置书的次数

    参数2:若参数2为True,则表示把数组中的值作为根,然后反推多项式,例如:

    q = np.poly1d([2,3,5],True)

    print(q) ===>>(x - 2)(x - 3)(x - 5) = x3 - 10x2 + 31x -30

    参数3:variable=‘z’表示改变未知数的字母,例如:

    q = np.poly1d([2,3,5],True,varibale = ‘z’)

    print(q) ===>>(z - 2)(z - 3)(z - 5) = z3 - 10z2 + 31z -30

    2、多项式poly1d()的方法

    a.  p(0.5)表示当x = 0.5时,多项式的值为多少

    b.  p.r表示当多项式为 0 时,此等式的根

    c.  p.c表示生成多项式的系数数组

    d.  p.order表示返回最高项的次方数

    e.  p[1]表示返回第一项的系数

    f.  多项式支持实数的四则运算

    3、 其他函数

    a.  deriv([m])表示求导,参数m表示求几次导数

    b.  integ([m,k])表示积分,参数m表示积几次分,k表示积分后的常数项的值

    sns线性关系的展示

    seaborn主要通过两个函数来展示通过回归得到的线性关系,regplot()和lmplot()。

    sns.regplot(x='tital_bill',y='tip',data=tips)
    sns.lmplot(x="total_bill", y="tip", data=tips);
    
    
    • 1
    • 2
    • 3

    他们之间最主要的区别在于
    regplot()中的x, y参数接受多种数据类型,包括numpy数组、pandas序列(Series),或者将pandas DataFrame传递给data参数。
    lmplot()的data参数是不能为空的,同时x和y参数必须以字符串形式指定
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    部分引用:

    https://www.jianshu.com/p/f83d61952983

  • 相关阅读:
    ZooKeeper 核心知识总结
    Pinpoint--基础--02--架构设计
    element ui中的el-tree自定义每个节点,前面加不同颜色的块
    Redis 集合(Set)快速指南 | Navicat
    win11一直弹出用户账户控制怎么解决
    SQL注入的原理分析
    Blazor WebAssembly 渐进式 Web 应用程序 (PWA) 离线处理数据
    Shell脚本编程实践——第3关:使用Shell脚本创建文件目录
    SQL优化之深分页
    17-ROS tf包介绍
  • 原文地址:https://blog.csdn.net/m0_52024881/article/details/125988244