精华内容
下载资源
问答
  • Dw基础课-网站常见元素及CSS基础(字、链接)

    网站常见元素

    网页常见构成元素:文字、图片、特效

    1. 文字:字体、大小
      字体常见宋体、微软雅黑(Microsoft Yahei)
      宋体大小在12或14px
      微软雅黑字体在12px以上
    2. 图片:格式、大小
      图片常见格式有JPG/PNG/GIF,其中PNG/GIF均可为透明底,但GIF只有256色
      图片大小量级控制在KB
    3. 特效:Javascript/Canvans

    网页中对大图(500KB以上)需要进行切片,每张控制在200K左右,即可保证大图质量,又可提高网页加载速度


    静态、动态网页区别——网页是否连接数据库

    1. 动态(.aspx)-维护方便、查询方便//制作成本高,需要专业人员
    2. 静态(.html)-打开快、容易被搜索、安全//维护繁琐,无后台

    网页常见结构

    <html>
      <head>
         <titile>
         </title>
      </head>
      <body>
      </body>
    </html>

    网页首页文件通常命名为 index.html / default.html


    CSS(Cascading Style Sheet)

    CSS的代码实现

    <html>
      <head>
         <titile>
         </title>
         <style>
            .sty1{
                font-family:"宋体";
                font-size:16px;
                ....
            }
         </style>
      </head>
      <body>
      </body>
    </html>

    即在head下调用style标签,并以英文字符“.”为开始,加样式名,开始规定样式属性

    1. 常见样式
      1.1 font-family:字体
      1.2 font-size:字号
      1.3 color:颜色
      1.4 line-height:行高(通常为字体大小X2±3),即行间距
      1.5 font-weight:加粗/变细,通常有normal/bold/bolder/…
      1.6 text-indent: 通常为字体X2,完成段落的首行缩进

    2. 超链接
      格式为a href=”地址”

      HTML页面属性中进行超链接的字体设置,通常“链接”、“已访问”同色;“变换”、“活动”同色

    image

    展开全文
  • 在HTML 5中,新增或改良的元素还有许多,主要分为以下几大类:文档元素、脚本、节点元素、文本元素、嵌入元素等。下面以实例的形式,介绍文本元素在HTML 5中的使用方法。 页面中常常需要展示的一段文章或文字称为...

    在HTML 5中,新增或改良的元素还有许多,主要分为以下几大类:文档元素、脚本、节点元素、文本元素、嵌入元素等。下面以实例的形式,介绍文本元素在HTML 5中的使用方法。

    页面中常常需要展示的一段文章或文字称为文本内容。为了使文本内容更加形象、生动,需要增加一些特殊功能的元素,用于突出文本间的层次关系或标为重点,这样的元素称为文本层次语义标记。

    在HTML 5中,常用于文本层次语义的元素有<time>、<mark>和<cite>。下面分别进行详细说明。

    3.6.1 time 元素

    <time>是HTML 5新增加的一个标记,用于定义时间或日期。该元素可以代表24小时中的某一时刻,在表示时刻时,允许有时间差。在设置时间或日期时,只需将该元素的属性“datetime”设为相应的时间或日期即可。

    例如,在新建的HTML页面中加入如下代码:

    ...省略部分代码
    <p id="p1">
     <time datetime="2011-4-9">
      今天是2011年4月9日
     </time>
    <p>
    <p id="p2">
     <time datetime="2011-4-9T21:00">
      现在时间是2011年4月9日晚上9点
     </time>
    <p>

    <p id="p3">
           <time datetime="2011-12-31">
             新款PSP2掌上游戏机将于今年年底上市
           </time>
    </p>
     <p id="p4">
           <time datetime="2011-5-1" pubdate="true">
             本消息发布于2011年5月1日
           </time>
    </p>

    ...省略部分代码

    <p>元素ID号为“p1”中的<time>元素表示的是日期。页面在解析时,获取的是属性“datetime”中的值,而标记之间的内容只是用于显示在页面中。

    <p>元素ID号为“p2”中的<time>元素表示的是日期和时间,它们之间使用字母“T”进行分隔。如果在整个日期与时间的后面加上一个字母Z,则表示获取的是UTC(世界统一时间)格式。

    <p>元素ID号为“p3”中的<time>元素表示的是将来时间。

    <p>元素ID号为“p4”中的<time>元素表示的是发布日期。

    为了在文档中将这两个日期进行区分,在最后一个<time>元素中增加了“pubdate”属性,表示此日期为发布日期。

    说明 <time>元素中的可选属性“pubdate”表示时间是否为发布日期,它是一个布尔值,该属性不仅可以用于<time>元素,还可用于<article>元素。

    3.6.2 mark 元素

    <mark>元素是HTML 5中新增的元素,主要功能是在文本中高亮显示某个或某几个字符,旨在引起用户的特别注意。其使用方法与<em>和<strong>有相似之处,但相比而言,HTML 5中新增的<mark>元素在突出显示时,更加随意与灵活。

    下面通过一个完整的实例3-5来介绍该元素的使用方法。

    实例3-5 元素<mark>的使用

    1.功能描述

    在页面中,首先使用<h5>元素创建一个标题“优秀开发人员的素质”,然后通过<p>元素对标题进行阐述。在阐述的文字中,为了引起用户的注意,使用<mark>元素高亮处理字符“素质”、“过硬”和“务实”。

    2.实现代码

    在Dreamweaver CS5中新建一个HTML页面3-5.html,加入代码如代码清单3-5所示。

    代码清单3-5 mark元素的使用

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>mark元素的使用</title>
    <link href="Css/css3.css" rel="stylesheet" type="text/css">
    </head>
    <body>
     <h5>优秀开发人员的<mark>素质</mark></h5>
     <p class="p3_5">
        一个优秀的Web页面开发人员,必须具有
        <mark>过硬</mark>的技术与
        <mark>务实</mark>的专业精神
     </p>
    </body>
    </html>

    3.页面效果

    该页面在Chrome 10浏览器下执行的页面效果如图3-6所示。

     

    图3-6 使用<mark>元素的页面效果

    4.源码分析

    在本实例中,通过使用<mark>元素,将文字中的“素质”、“过硬”和“务实”三个字符进行了高亮显示的处理,实现方法如源码中加粗部分所示。

    <mark>元素的这种高亮显示的特征,除用于文档中突出显示外,还常用于查看搜索结果页面中关键字的高亮显示,其目的主要是引起用户的注意。

    虽然<mark>元素在使用效果上与<em>或<strong>元素有相似之处,但三者的出发点是不一样的。<strong>元素是作者对文档中某段文字的重要性进行的强调;<em>元素是作者为了突出文章的重点而进行的设置;<mark>元素是数据展示时,以高亮的形式显示某些字符,与原作者本意无关。

    3.6.3 cite 元素

    <cite>元素可以创建一个引用标记,用于文档中参考文献的引用说明,如书名或文章名称。一旦在文档中使用了该标记,被标记的文档内容将以斜体的样式展示在页面中,以区别于段落中的其他字符。

    下面通过一个完整的实例3-6来介绍该元素的使用方法。

    实例3-6 元素<cite>的使用

    1.功能描述

    在页面中,首先通过<p>元素显示一段文档;然后,在文档的下面使用<cite>元素标识这段文档所引用的书名。

    2.实现代码

    在Dreamweaver CS5中新建一个HTML页面3-6.html,加入代码如代码清单3-6所示。

    代码清单3-6 cite元素的使用

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>cite元素的使用</title>
    <link href="Css/css3.css" rel="stylesheet" type="text/css">
    </head>
    <body>
     <h5>jQuery </h5>
     <p>
        jQuery 是继Prototype之后的一个优秀的JavaScript框架,
        深受全球开发者的欢迎...</p>
     <p>
        --- 引自 << <cite>jQuery 权威指南</cite> >> ---
     </p>
    </body>
    </html>

    3.页面效果

    该页面在Chrome 10浏览器下执行的页面效果如图3-7所示。

     

    图3-7 使用<cite>元素的页面效果

    4.源码分析

    在上述代码中,使用<cite>元素标识这段文档所引用的书名“jQuery 权威指南”,因此,该书名在页面中显示为斜体。

    注意 HTML 5中的<cite>元素基本兼容了HTML 4中的全部功能,但定义时更加严格。在使用该元素时,只允许包含标题或书名,不允许包含更多的其他引用信息,如作者姓名、出版日期等。

    -------------------------------------

    本文节选自《HTML 5实战》第3章《HTML 5中的重要元素》第3.6节“文本层次语义”(作者:陶国荣)。

    《HTML 5实战》内容简介:

    全书共11章,内容涵盖了HTML 5的各个方面。第1章通过实现一个简单的HTML 5页面讲解了如何搭建支持HTML 5的浏览器环境、HTML 5页面所具备的特征,以及如何检测浏览器对HTML 5的各种特性的支持情况;第2章介绍了HTML 5中常用的交互元素,包括内容交互元素、菜单交互元素和状态交互元素等几大类;第3章介绍了HTML根元素、文档元素,以及与脚本、节点、分组内容、文本层次语义、嵌入内容、公共属性相关的重要元素;第4章和第5章讲解了HTML 5中的表单和文件的功能特性以及常见的各种操作;第6章和第7章讲解了HTML 5中的音频、视频和绘图相关的知识,重点讲解了各种常见的操作和使用方法;第8章和第9章讲解了HTML 5中的数据存储和离线应用;第10章对Web Sockets、Geolocation、Web Workers、元素的拖放等重要内容进行了全面的讲解。

    作者简介:

    陶国荣,资深Web技术专家,有十余年开发经验,是国内较早专业从事Web开发的一线技术人员和培训讲师。一直致力于对HTML、JavaScript、CSS、jQuery等Web开发技术的研究和实践,在HTML页面的优化与用户体验的研究,以及页面框架搭建、数据流向分析、页面静态优化等方面都拥有丰富的实践经验。自HTML 5的草案发布以来,一直密切关注HTML 5的发展,坚持在实际工作中学习与研究,并进行了实践。他还是微软技术方面的专家,精通C#、ASP.NET和SQL Server等技术。
    此外,他还是一位知名的技术作家,出版了多部技术著作,其中《jQuery权威指南》是他的代表作之一,这本书凭借过硬的质量和良好的学习体验获得了广大读者的高度评价,并取得了骄人的销售成绩。

    展开全文
  • Seaborn常见绘图总结

    万次阅读 多人点赞 2019-01-24 15:52:55
    听“他们”说matplotlib中的seaborn绘图很好看而且实用,所以,这里系统的总结一下seaborn常见的图形绘制。其目的也是很简单的啦,方便我自己查看(英文很菜,每次都查单词……)。 差点忘了,这里使用的数据还是...

    以前粗略的学习过Matplotlib绘图、Pandas绘图(这里是pandas的常见绘图总结),但是都未深入的去学习过,一遇到问题就翻文档,效率低下。听“他们”说matplotlib中的seaborn绘图很好看而且实用,所以,这里系统的总结一下seaborn常见的图形绘制。其目的也是很简单,方便自己和给大家提供一些帮助(由于英文很菜,每次都查单词,有些词汇就翻译的很生硬,还请谅解……)。

    差点忘了,这里使用的数据还是seaborn的默认数据,很多人再看seaborn的时候对数据一头雾水,这里我将存放数据的GitHub放在这儿,理解数据的含义,对分析问题往往起着事半功倍的效果。

    https://github.com/mwaskom/seaborn-data

    根据Seaborn的API,具体如下:

    正文

    1.Relational plots(关系图)

    Seaborn中介绍的第一种类型的图就是Relational plots(关系图),这里翻译一下官网对他的解释:“统计分析是理解数据集中变量如何相互关联以及这些关系如何依赖于其他变量的过程。可视化可能是这个过程的核心部分,因为当数据被正确地可视化时,人类视觉系统可以看到指示某种关系的趋势和模式。”
    Relational plots(关系图)中主要讨论的是三个seaborn函数。我们最常用的是relplot()。这是一个图形级函数使用两种常用方法可视化统计关系:散点图(scatter plots)和线图(line plots)。

     1. scatterplot() (与kind="scatter";默认值)
     2. lineplot() (与kind="line")
    

    还是第一步,导入我们需要的各种模块:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set(style="darkgrid") #这是seaborn默认的风格
    

    1.1 scatterplot(散点图)

    散点图是统计可视化的重要组成部分。它使用点云来描述两个变量的联合分布,其中每个点代表数据集中的一个观察。这种描绘可以推断出大量关于它们之间是否有任何有意义的关系的信息。
    在seaborn中有几种(后面介绍)绘制散点图的方法,当两个变量都是数字时,应该使用的最基本的是scatterplot()功能。在Categorical plots(分类图)中,我们将看到使用散点图可视化分类数据的专门工具。

    #scatterplot参数
    seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, 
    data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, 
    size_order=None, size_norm=None, markers=True, style_order=None,
     x_bins=None, y_bins=None, units=None, estimator=None, ci=95, n_boot=1000, 
     alpha='auto', x_jitter=None, y_jitter=None, legend='brief', ax=None, **kwargs)
    

    在所有的seaborn绘图时,里面的参数是众多的,但是不用担心,大部分参数是相同的,只有少部分存在差异,有些通过对单词的理解就可知道其含义,这里我只根据每个具体的图形重要的参数做一些解释,并简单的介绍这些常用参数的含义。

    • x,y:容易理解就是你需要传入的数据,一般为dataframe中的列;
    • hue:也是具体的某一可以用做分类的列,作用是分类;
    • data:是你的数据集,可要可不要,一般都是dataframe;
    • style:绘图的风格(后面单独介绍);
    • size:绘图的大小(后面介绍);
    • palette:调色板(后面单独介绍);
    • markers:绘图的形状(后面介绍);
    • ci:允许的误差范围(空值误差的百分比,0-100之间),可为‘sd’,则采用标准差(默认95);
    • n_boot(int):计算置信区间要使用的迭代次数;
    • alpha:透明度;
    • x_jitter,y_jitter:设置点的抖动程度。

    先来个简单的散点图,绘制看看效果

    #数据来源可在seaborn的GitHub上查找
    tips = sns.load_dataset("tips")
    ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
    

    在这里插入图片描述
    接下来,复杂一点,按另一个变量分组(hue参数起了作用),不同类型的方式(style),点的大小(size),并显示具有不同颜色的组:

    ax = sns.scatterplot(x="total_bill", y="tip",hue="day",
     style="time",size='size',data=tips)
    

    在这里插入图片描述
    是不是复杂的多,当然还有很多参数可以改,这里就不一一介绍了,接下来看lineplot。

    1.2 lineplot(线图)

    seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None,
     data=None, palette=None, hue_order=None, hue_norm=None, sizes=None,
      size_order=None, size_norm=None, dashes=True, markers=None, 
      style_order=None, units=None, estimator='mean', ci=95, n_boot=1000, 
      sort=True, err_style='band', err_kws=None, legend='brief', ax=None, **kwargs)
    

    可以看出,参数并没有较散点图有较大的改变,所以话不多说,直接上图:

    还是下来个简单的:

    fmri = sns.load_dataset("fmri")
    ax = sns.lineplot(x="timepoint", y="signal", data=fmri)
    
    #阴影是默认的置信区间,可设置ci=0,将其去除
    

    阴影是默认的置信区间,可设置ci=0,将其去除
    接下来,来个复杂一点儿的:

    #使用标记而不是破折号来识别组
    ax = sns.lineplot(x="timepoint", y="signal",hue="event", style="event",
    markers=True, dashes=False, data=fmri)
    

    在这里插入图片描述

    1.3 relplot(关系图)

    seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, 
    data=None, row=None, col=None, col_wrap=None, row_order=None, 
    col_order=None, palette=None, hue_order=None, hue_norm=None, 
    sizes=None, size_order=None, size_norm=None, markers=None, dashes=None,
     style_order=None, legend='brief', kind='scatter', height=5, aspect=1,
      facet_kws=None, **kwargs)
    

    relplot(关系图)可以看做是lineplot和scatterplot的归约,可以通过kind参数来指定画什么图形,重要参数解释如下:

    • kind:默认scatter(散点图),也可以选择kind=‘line’(线图);
    • sizes:List、dict或tuple,可选,简单点就是图片大小,注意和size区分;
    • col、row:将决定网格的面数的分类变量,具体看实例;
    tips = sns.load_dataset("tips")
    g = sns.relplot(x="total_bill", y="tip", data=tips)
    #两者效果一模一样
    ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
    

    在这里插入图片描述
    其他参数设置:

    g = sns.relplot(x="total_bill", y="tip", hue="time", size="size",
    palette=["b", "r"], sizes=(10, 100),col="time",row='sex', data=tips)
    

    在这里插入图片描述
    关于kind=‘line’,这里就不画了,重点是理解参数的意义。

    2.Categorical plots(分类图)

    Categorical plots(分类图)可以具体分为下面三种类型,8个小图:

    1. Categorical scatterplots(分类散点图)
      stripplot(分布散点图)
      swarmplot(分布密度散点图)
    2. Categorical distribution plots(分类分布图)
      boxplot(箱线图)
      violinplot(小提琴图)
      boxenplot(字母价值图???)
    3. Categorical estimate plots(分类估计图)
      pointplot(点图)
      barplot(条形图)
      countplot(计数统计图)

    2.1 Categorical scatterplots(分类散点图)

    2.1.1 stripplot(分布散点图)

    stripplot(分布散点图)的意思就是按照不同类别对样本数据进行分布散点图绘制。stripplot(分布散点图)一般并不单独绘制,它常常与boxplot和violinplot联合起来绘制,作为这两种图的补充。

    seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, jitter=True, dodge=False, orient=None, color=None, 
    palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
    
    • x,y,data:输入数据可以多种格式传递,在大多数情况下,使用Numpy或Python对象是可能的,但是更可取的是pandas对象,因为相关的名称将用于对轴进行注释。此外,还可以对分组变量使用分类类型来控制情节元素的顺序。
    • order:用order参数进行筛选分类类别,例如:order=[‘sun’,‘sat’];
    • jitter:抖动项,表示抖动程度,可以使float,或者True;
    • dodge:重叠区域是否分开,当使用hue时,将其设置为True,将沿着分类轴将不同色调级别的条带分开。
    • orient:“v” | “h”,vertical(垂直) 和 horizontal(水平)的意思;

    基本的图

    tips = sns.load_dataset("tips")
    ax = sns.stripplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    多增加几个参数的修改:

    ax = sns.stripplot(x="day", y="total_bill", hue="smoker",data=tips, 
    jitter=True,palette="Set2", dodge=True)
    

    在这里插入图片描述

    2.1.2 swarmplot(分布密度散点图)

    这个函数类似于stripplot(),但是对点进行了调整(只沿着分类轴),这样它们就不会重叠。这更好地表示了值的分布,但它不能很好地扩展到大量的观测。

    seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None,
     hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, 
     edgecolor='gray', linewidth=0, ax=None, **kwargs)
    

    可以看出,swarmplot和stripplot参数上基本一致,少了jitter,因为它显示的是分布密度,不需要添加抖动项。

    ax = sns.swarmplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    多增加几个参数的修改:

    ax = sns.swarmplot(x="day", y="total_bill", hue="smoker",data=tips,palette="Set2", dodge=True)
    

    在这里插入图片描述

    2.2 Categorical distribution plots(分类分布图)

    2.2.1 boxplot(箱线图)

    boxplot(箱线图,又称为盒须图、盒式图)便于在变量之间或跨类别变量级别比较的方式,显示定量数据的分布情况。框显示数据集的四分位数,线显示分布的其余部分,它能显示出一组数据的最大值、最小值、中位数及上下四分位数,使用四分位数范围函数的方法可以确定“离群值”的点。具体用法如下:

    seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
    width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
    
    • saturation:饱和度,可设置为1;
    • width:float,控制箱型图的宽度大小;
    • fliersize:float,用于指示离群值观察的标记大小;
    • whis:可理解为异常值的上限IQR比例;
    • notch:我也不知道……
    ax = sns.boxplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述

    #这些参数不一定要加,简单最好,这里只是为了展示参数的含义
    ax = sns.boxplot(x="day", y="total_bill", hue="time",data=tips, 
                     linewidth=0.5,saturation=1,width=1,fliersize=3)
    

    在这里插入图片描述

    2.2.2 violinplot(小提琴图)

    violinplot与boxplot扮演类似的角色,箱线图展示了分位数的位置,它显示了定量数据在一个(或多个)分类变量的多个层次上的分布,这些分布可以进行比较。不像箱形图中所有绘图组件都对应于实际数据点,小提琴绘图以基础分布的核密度估计为特征,通过小提琴图可以知道哪些位置的密度较高。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
    这是一种可以同时显示多个数据分布的有效和有吸引力的方法,但请记住,估计过程受样本大小的影响,相对较小的样本的小提琴手看起来可能会显得非常平滑。具体用法如下:

    seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100, 
    width=0.8, inner='box', split=False, dodge=True, orient=None, linewidth=None, 
    color=None, palette=None, saturation=0.75, ax=None, **kwargs)
    
    • bw:‘scott’, ‘silverman’, float,控制拟合程度。在计算内核带宽时,可以引用规则的名称(‘scott’, ‘silverman’)或者使用比例(float)。实际内核大小将通过将比例乘以每个bin内数据的标准差来确定;
    • cut:空值外壳的延伸超过极值点的密度,float;
    • scale:“area”, “count”, “width”,用来缩放每把小提琴的宽度的方法;
    • scale_hue:当使用hue分类后,设置为True时,此参数确定是否在主分组变量进行缩放;
    • gridsize:设置小提琴图的平滑度,越高越平滑;
    • inner:“box”, “quartile”, “point”, “stick”, None,小提琴内部数据点的表示。分别表示:箱子,四分位,点,数据线和不表示;
    • split:是否拆分,当设置为True时,绘制经hue分类的每个级别画出一半的小提琴;
    ax = sns.violinplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    设置按性别分类,调色为“Set2”,分割,以计数的方式,不表示内部。

    ax = sns.violinplot(x="day", y="total_bill", hue="sex",data=tips, 
    palette="Set2", split=True,scale="count", inner=None)
    

    在这里插入图片描述

    2.2.3 violinplot+stripplot(小提琴图+分布散点图)

    ax = sns.violinplot(x="tip", y="day", data=tips, inner=None,whis=np.inf)
    ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
    

    在这里插入图片描述

    2.2.4 violinplot+swarmplot(小提琴图+分布密度散点图)

    ax = sns.violinplot(x="tip", y="day", data=tips,inner=None, whis=np.inf)
    ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
    

    在这里插入图片描述

    2.2.5 boxplot+stripplot(箱线图+分布散点图)

    ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
    ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
    

    在这里插入图片描述

    2.2.6 boxplot+swarmplot(箱线图+分布密度散点图)

    ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
    ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
    

    在这里插入图片描述

    2.3 Categorical estimate plots(分类估计图)

    2.3.1 barplot(条形图)

    条形图表示数值变量与每个矩形高度的中心趋势的估计值,用矩形条表示点估计和置信区间,并使用误差线提供关于该估计值附近的不确定性的一些指示。具体用法如下:

    seaborn.barplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, 
    estimator=<function mean>, ci=95, n_boot=1000, units=None, orient=None, 
    color=None, palette=None, saturation=0.75, errcolor='.26', errwidth=None,
    capsize=None, dodge=True, ax=None, **kwargs)
    
    • estimator:用于估计每个分类箱内的统计函数,默认为mean。当然你也可以设置estimator=np.median/np.std/np.var……
    • order:选择和空值顺序,例如:order=[‘Sat’,‘Sun’];
    • ci:允许的误差的范围(控制误差棒的百分比,在0-100之间),若填写"sd",则用标准误差(默认为95),也可设置ci=None;
    • capsize:设置误差棒帽条(上下两根横线)的宽度,float;
    • saturation:饱和度;
    • errcolor:表示置信区间的线条的颜色;
    • errwidth:float,设置误差条线(和帽)的厚度。

    根据性别分组:

    ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
    

    在这里插入图片描述
    设置estimator为中位数(numpy的统计函数都可以,只要你觉得有意义),设置误差棒的宽度,误差棒的颜色为“c”。

    ax = sns.barplot(x="day", y="total_bill",hue='sex', data=tips, 
    estimator=np.median,capsize=0.2,errcolor='c')
    

    在这里插入图片描述

    2.3.2 countplot(计数图)

    一个计数图可以被认为是一个分类直方图,而不是定量的变量。基本的api和选项与barplot()相同,因此您可以比较嵌套变量中的计数。(工作原理就是对输入的数据分类,条形图显示各个分类的数量)。具体参数如下:

    seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
    dodge=True, ax=None, **kwargs)
    

    这里参数并没有太多改变,orient就是改变方向。但是,值得注意的是缺少了一些参数,而且countplot中不能同时输入x和y,却可以使用hue(这我就很纳闷了???还望大佬解释解释)。

    titanic = sns.load_dataset("titanic")
    ax = sns.countplot(x="class", hue="who", data=titanic)
    

    在这里插入图片描述

    2.3.3 piontplot(点图)

    用散点图符号表示点估计和置信区间,点图代表散点图位置的数值变量的中心趋势估计,并使用误差线提供关于该估计的不确定性的一些指示。点图可能比条形图(barplot)更有用于聚焦一个或多个分类变量的不同级别之间的比较。他们尤其善于表现交互作用:一个分类变量的层次之间的关系如何在第二个分类变量的层次之间变化。连接来自相同色调等级的每个点的线允许交互作用通过斜率的差异进行判断,这比对几组点或条的高度比较容易。具体用法如下:

    seaborn.pointplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, estimator=<function mean>, ci=95, n_boot=1000, 
    units=None, markers='o', linestyles='-', dodge=False, join=True, 
    scale=1, orient=None, color=None, palette=None, errwidth=None, 
    capsize=None, ax=None, **kwargs)
    
    • join:默认两个均值点会相连接,若不想显示,可以通过join=False参数实现;
    • scale:float,均值点(默认)和连线的大小和粗细。
    tips = sns.load_dataset("tips")
    ax = sns.pointplot(x="time", y="total_bill", data=tips)
    

    在这里插入图片描述
    尝试更多参数,按性别分组,用中位数进行比较,分开显示,使用调色板,修改标记类型和线条类型(很多参数都不是必要的,这里只是尽量充分介绍其用法)。

    ax = sns.pointplot(x="time", y="total_bill", hue="smoker",data=tips,estimator=np.median,
    dodge=True, palette="Set2",markers=["o", "x"],linestyles=["-", "--"])
    

    在这里插入图片描述

    2.3.4 catplot()

    该函数提供了对几个轴级函数的访问,这些函数使用几种可视化表示形式之一显示一个数字变量和一个或多个分类变量之间的关系。其实说白了就是利用kind参数来画前面Categorical plots(分类图)中的任意8个图形。具体如下:

    seaborn.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, 
    col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, 
    order=None, hue_order=None, row_order=None, col_order=None, kind='strip',
     height=5, aspect=1, orient=None, color=None, palette=None, legend=True, 
     legend_out=True, sharex=True, sharey=True, margin_titles=False, 
     facet_kws=None, **kwargs)
    

    有没有发现,它和regplot(关系图)的使用方法差不多?

    • kind:默认strip(分布散点图),也可以选择“point”, “bar”, “count”,
    • col、row:将决定网格的面数的分类变量,可具体制定;
    • col_wrap:指定每行展示的子图个数,但是与row不兼容;
    • row_order, col_order : 字符串列表,安排行和列,以及推断数据中的对象;
    • height,aspect:与图像的大小有关;
    • sharex,sharey:bool, ‘col’or ‘row’,是否共享想,x,y坐标;

    注:单个图形里面的参数也是可以传入里面的

    绘制一个小提琴图,按数据中的kind类别分组(数据中的),不要中心框线。

    exercise = sns.load_dataset("exercise")
    g = sns.catplot(x="time", y="pulse", hue="kind",data=exercise, kind="violin",inner=None)
    

    在这里插入图片描述
    使用diet来分成几个图形,并用height、aspect来设置图片比例:

    g = sns.catplot(x="time", y="pulse", hue="kind",kind='bar',col="diet", 
    data=exercise,height=4, aspect=0.8)
    

    在这里插入图片描述

    3 Distribution plots(分布图)

    3.1 distplot(直方图)

    直方图又称质量分布图,它是表示资料变化情况的一种主要工具。用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。直方图表示通过沿数据范围形成分箱(好像是等距分箱?),然后绘制条以显示落入每个分箱的观测次数的数据分布。具体参数如下:

    seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, 
    hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None,
     vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
    
    • bins:int或list,控制直方图的划分,设置矩形图(就是块儿的多少)数量,除特殊要求一般默认;
    • hist:是否显示方块;
    • kde:是否显示核密度估计曲线;
    • rug:控制是否生成观测数值的小细条(边际毛毯);
    • fit:控制拟合的参数分布图形,能够直观地评估它与观察数据的对应关系(黑色线条为确定的分布);
      -{hist, kde, rug, fit}_kws :参数接收字典类型,可以自行定义更多高级的样式;
    • norm_hist:若为True, 则直方图高度显示密度而非计数(含有kde图像中默认为True);
    • vertical:放置的方向,如果为真,则观测值位于y-轴上(默认False,x轴上);
    • axlabel : string, False, or None, 设置标签。

    设置随机种子(666),随机生成1000个符合正态分布的数:

    np.random.seed(666)
    x = np.random.randn(1000)
    ax = sns.distplot(x)
    

    在这里插入图片描述
    修改更多参数,设置方块的数量,方块、密度曲线和边际毛毯都显示,颜色为‘k’,axlabel=‘norm’。

    np.random.seed(666)
    x = np.random.randn(1000)
    ax = sns.distplot(x, bins=100,hist=True, kde=True, rug=True,color='k',axlabel='norm')
    

    在这里插入图片描述

    3.2 kdeplot(核密度图)

    核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。通过核密度估计图可以比较直观的看出数据样本本身的分布特征。具体用法如下:

    seaborn.kdeplot(data, data2=None, shade=False, vertical=False, kernel='gau', 
    bw='scott', gridsize=100, cut=3, clip=None, legend=True, cumulative=False, 
    shade_lowest=True, cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)
    
    • data、data2:表示可以输入双变量,绘制双变量核密度图;
    • shade:是否填充阴影,默认不填充;
    • vertical:放置的方向,如果为真,则观测值位于y轴上(默认False,x轴上);
    • kernel:{‘gau’ | ‘cos’ | ‘biw’ | ‘epa’ | ‘tri’ | ‘triw’ }。默认高斯核(‘gau’)二元KDE只能使用高斯核。至于什么是核函数,这个学问就大了,建议多看看论文;
    • bw:{‘scott’ | ‘silverman’ | scalar | pair of scalars }。四类核密度带方法,默认scott (斯考特带宽法),建议下来了解一下这四种方法的区别;
    • gridsize:这个参数指的是每个格网里面,应该包含多少个点,越大,表示格网里面的点越多(觉得电脑OK的可以试试,有惊喜),越小表示格网里面的点越少;
    • cut:参数表示,绘制的时候,切除带宽往数轴极限数值的多少,这个参数可以配合bw参数使用;
    • cumulative:是否绘制累积分布;
    • shade_lowest:是否有最低值渲染,这个参数只有在二维密度图上才有效;
    • clip:表示查看部分结果,是一个区间;
    • cbar:参数若为True,则会添加一个颜色棒(颜色帮在二元kde图像中才有);

    有木有觉得参数超多,所以说核密度图还是比较难的(虽然容易画,但原理很复杂)。下面看几个简单的例子:简单生成一个多元正态分布(对numpy随机分布不了解的朋友,可以看我总结的numpy函数)。

    mean, cov = [0, 2], [(1, .5), (.5, 1)]
    #这是一个多元正态分布
    x, y = np.random.multivariate_normal(mean, cov, size=50).T
    ax = sns.kdeplot(x)
    

    在这里插入图片描述
    接下来绘制双变量核密度图①:

    ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar=True,color='r')
    

    在这里插入图片描述
    接下来绘制双变量核密度图②:二色二元密度图,使用大名鼎鼎的鸢尾花数据集

    iris = sns.load_dataset("iris")
    setosa = iris.loc[iris.species == "setosa"]
    virginica = iris.loc[iris.species == "virginica"]
    ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length,cmap="Reds",
     shade=True, shade_lowest=False)
    ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length,cmap="Blues", 
    shade=True, shade_lowest=False)
    

    在这里插入图片描述

    3.3 jointplot(联合分布图)

    联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。根据随机变量的不同,联合概率分布的表示形式也不同。对于离散型随机变量,联合概率分布可以以列表的形式表示,也可以以函数的形式表示;对于连续型随机变量,联合概率分布通过一非负函数的积分表示。具体参数如下:

    seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, 
    height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None,
     marginal_kws=None, annot_kws=None, **kwargs)
    
    • x,y:为DataFrame中的列名或者是两组数据,data指向dataframe;
    • kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默认散点图;
    • stat_func:用于计算统计量关系的函数;
    • ratio:中心图与侧边图的比例,越大、中心图占比越大;
    • dropna:去除缺失值;
    • height:图的尺度大小(正方形);
    • space:中心图与侧边图的间隔大小;
    • xlim,ylim:x,y的范围

    用边缘直方图绘制散点图:

    tips = sns.load_dataset("tips")
    g = sns.jointplot(x="total_bill", y="tip", data=tips,height=5)
    

    在这里插入图片描述
    #用密度估计替换散点图和直方图,调节间隔和比例:

    iris = sns.load_dataset("iris")
    g = sns.jointplot("sepal_width", "petal_length", data=iris,kind="kde", space=0,ratio=6 ,color="r")
    

    在这里插入图片描述

    3.4 pairplot(变量关系组图)

    在数据集中绘制成对关系的图。默认情况下,该函数将创建一个轴网格,这样数据中的每个变量都将通过跨一行的y轴和跨单个列的x轴共享。对对角线轴的处理方式不同,绘制的图显示该列中变量的数据的单变量分布。此外,还可以在行和列上显示变量子集或绘制不同的变量。具体如下:

    seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, 
    x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None,
     height=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, 
     grid_kws=None, size=None)
    
    • var:data中的子集,否则使用data中的每一列;
    • x_vars / y_vars:可以具体细分,谁与谁比较;
    • kind:{‘scatter’, ‘reg’};
    • diag_kind:{‘auto’, ‘hist’, ‘kde’}。单变量图(自己与自己比较)的绘图,对角线子图的图样。默认情况取决于是否使用“hue”。

    采用默认格式绘制鸢尾花数据集,这样对于分类问题来说并不能有效的观察数据情况。

    iris = sns.load_dataset("iris")
    g = sns.pairplot(iris)
    

    在这里插入图片描述
    使用hue="species"对不同种类区分颜色绘制,并使用不同标记:

    g = sns.pairplot(iris, hue="species", markers=["o", "s", "D"])
    

    在这里插入图片描述

    4 Regression plots(回归图)

    4.1 lmplot(回归图)

    许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合。具体参数如下:

    seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, 
    col_wrap=None, height=5, aspect=1, markers='o', sharex=True, sharey=True, 
    hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, 
    x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, 
    n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, 
    logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, 
    y_jitter=None, scatter_kws=None, line_kws=None, size=None)
    
    • col,row:和前面一样,根据所指定属性在列,行上分类;
    • col_wrap:指定每行的列数,最多等于col参数所对应的不同类别的数量;
    • aspect:控制图的长宽比;
    • x_jitter,y_jitter:给x,y轴随机增加噪音点,设置这两个参数不影响最后的回归直线;
    • order:多项式回归,控制进行回归的幂次,设定指数,可以用多项式拟合;
    • logistic:逻辑回归;
    • robust:如果是True,使用statsmodels来估计一个稳健的回归(鲁棒线性模型)。这将减少异常值。请注意 logistic回归和robust回归相较于简单线性回归需要更大的计算量,其置信区间的产生也依赖于bootstrap采样,你可以关掉置信区间估计来提高速度(ci=None);
      • lowess:如果是True,使用statsmodels来估计一个非参数的模型(局部加权线性回归)。这种方法具有最少的假设,尽管它是计算密集型的,但目前无法为这类模型绘制置信区间;
    • logx:转化为log(x)
    • truncate:默认情况下,绘制散点图后绘制回归线以填充x轴限制。如果为True,则它将被数据限制所限制;
      绘制一个第三个变量的条件,并绘制不同颜色的回归图:
    g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
    

    在这里插入图片描述

    将变量分为多行,并改变大小:

    g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips,
     col_wrap=2, height=4)
    

    在这里插入图片描述

    4.2 regplot()

    regplot()和lmplot()都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。具体参数如下:

    seaborn.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', 
    scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, 
    lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, 
    truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, 
    marker='o', scatter_kws=None, line_kws=None, ax=None)
    

    至于两者有什么具体的区别,我也不清楚,但是感觉lmplot()要比regplot()强大一点……以后再总结吧,还是继续绘图。

    g = sns.regplot(x="total_bill", y="tip",data=tips)
    

    在这里插入图片描述
    尝试逻辑回归分类:

    tips["big_tip"] = (tips.tip / tips.total_bill) > .175
    ax = sns.regplot(x="total_bill", y="big_tip", data=tips,logistic=True, n_boot=500, y_jitter=.03)
    

    在这里插入图片描述

    5.Matrix plots(矩阵图)

    5.1 heatmap(热力图)

    利用热力图可以看数据表里多个特征两两的相似度,类似于色彩矩阵。具体参数如下:

    seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, 
    robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', 
    cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', 
    yticklabels='auto', mask=None, ax=None, **kwargs)
    
    • data:矩阵数据集,可以使numpy的数组(array),如果是pandas的dataframe,则df的index/column信息会分别对应到heatmap的columns和rows;
    • vmax,vmin:图例中最大值和最小值的显示值,没有该参数时默认不显示;
    • cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;
    • center:数据表取值有差异时,设置热力图的色彩中心对齐值。通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变 ;
    • robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定;
    • annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据;
    • fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字;
    • annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体;
    • square:设置热力图矩阵小块形状,默认值是False;
    • xticklabels, yticklabels:控制每行列标签名的输出。默认值是auto,自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出。如果是True,则以DataFrame的列名作为标签名;
    • mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉。

    绘制一个简单的numpy数组的热力图:

    x = np.random.rand(10, 12)
    ax = sns.heatmap(x)
    

    在这里插入图片描述
    显示数字和保留几位小数,并修改数字大小字体颜色格式:

    x= np.random.rand(10, 10)
    ax = sns.heatmap(x,annot=True,annot_kws={'size':9,'weight':'bold', 'color':'w'},fmt='.2f')
    

    在这里插入图片描述

    5.2 clustermap(聚类图)

    clustermap() 可以将矩阵数据集绘制为层次聚类热图。具体参数如下:

    seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', 
    z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, 
    col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, 
    mask=None, **kwargs)
    

    说实在的这个我也不太懂,就抛砖引玉的画一下图。

    iris = sns.load_dataset("iris")
    species = iris.pop("species")
    g = sns.clustermap(iris)
    

    在这里插入图片描述

    6 FacetGrid()

    在探索中多维数据时,一种有用的方法是在数据集的不同子集上绘制同一类型图的多个子图。该类将数据集映射到与数据集中变量级别相对应的行和列网格中排列的多个轴上。它生成的图形通常被称为“格子”或“格子”绘图,它可以使查看者快速观察到有关复杂数据的大量信息。

    FacetGrid当您想要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,该类非常有用。一个FacetGrid可以与多达三个维度可以得出:row,col,和hue。前两个与得到的轴阵列有明显的对应关系; 将hue变量视为沿深度轴的第三个维度,其中不同的级别用不同的颜色绘制。通过使用FacetGrid数据框初始化对象以及将形成网格的行,列或hue维度的变量名称来使用该类。这些变量(hue)应该是分类的或离散的,然后变量的每个级别的数据将用于沿该轴的小平面。此外,每个的relplot(),catplot()以及lmplot()在内部使用这些对象。

    在大多数情况下,与直接使用FacetGrid相比,使用图形级函数(例如relplot()或catart()要好得多。具体参数如下:

    seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, 
    sharex=True, sharey=True, height=3, aspect=1, palette=None, 
    row_order=None, col_order=None, hue_order=None, hue_kws=None, 
    dropna=True, legend_out=True, despine=True, margin_titles=False, 
    xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)
    

    其实细心的您可能已经发现某些具有相同的规律,不妨看看前面relplot()、catplot()、lmplot()的参数,是不是基本上差不多呢?没错,其实上面三个绘图函数,都用到了FacetGrid()的思想。此外,pairplot()走某种意义上来说,也与他们很像。

    FacetGrid并不能直接绘制我们想要的图像,它的基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象。然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_dataframe(),最后,可以使用其他修改参数的方法调整绘图。

    下面展示具体实例:使用TIPS数据集初始化2x2个面网格:

    tips = sns.load_dataset("tips")
    g = sns.FacetGrid(tips, col="time", row="smoker")#2*2
    

    在这里插入图片描述
    然后,在每个方面上绘制一个二元函数:

    tips = sns.load_dataset("tips")
    g = sns.FacetGrid(tips, col="time", row="smoker")
    g = g.map(plt.scatter, "total_bill", "tip", color="c")
    

    在这里插入图片描述
    这里我其实有个疑问,为什么g.map()里面用的是plt.scatter等matplotlib.pyplot来绘制图形,我尝试了用seaborn里面的sns.scatterplot等也可以绘制相应的图形,区别在于点的大小形状不一样,还望各位看官指点一下其中的差别。

    接下来比较一下FacetGrid.map()绘图与relplot()、catplot()、lmplot()绘图的区别(这里只比较relplot()来绘制散点图):

    sns.relplot(x="total_bill", y="tip", color="c",col="time",  hue="smoker",data=tips)
    

    在这里插入图片描述
    看出来了吗?结果是不是很清晰,一目了然?所以说:在大多数情况下,与直接使用FacetGrid相比,使用图形级函数(例如relplot()或catart()要好得多。

    7 PairGrid()

    用于绘制数据集中成对关系的子图网格。该类将数据集中的每个变量映射到多轴网格中的列和行。不同的轴级绘图函数可用于绘制上、下三角形的二元图解,并可在对角线上显示每个变量的边缘分布。读到这里你就会发现,它和pairplot()有什么区别呢?

    其实PairGrid和pairplot从原理来说是一样的,但是前面我们可以发现pairplot绘制的图像上、下三角形是关于主对角线对称的,而PairGrid则可修改上、下三角形和主对角线的图像形状。具体事例如下:

    iris = sns.load_dataset("iris")
    g = sns.PairGrid(iris,hue="species")
    g = g.map_upper(sns.scatterplot)#在上对角线子图上用二元函数绘制的图
    g = g.map_lower(sns.kdeplot,color='r')#在下对角线子图上用二元函数绘制的图
    g = g.map_diag(sns.kdeplot)#对角线单变量子图
    

    在这里插入图片描述

    8 主题和颜色

    8.1 主题(style)

    seaborn设置风格的方法主要有三种:

    1. set,通用设置接口
    2. set_style,风格专用设置接口,设置后全局风格随之改变
    3. axes_style,设置当前图(axes级)的风格,同时返回设置后的风格系列参数,支持with关键字用法

    seaborn中主要有以下几个主题:

    sns.set_style("whitegrid")  # 白色网格背景
    sns.set_style("darkgrid")   # 灰色网格背景
    sns.set_style("dark")       # 灰色背景
    sns.set_style("white")      # 白色背景
    sns.set_style("ticks")      # 四周加边框和刻度
    

    在这里插入图片描述
    相比matplotlib绘图风格,seaborn绘制的直方图会自动增加空白间隔,图像更为清爽。而不同seaborn风格间,则主要是绘图背景色的差异。

    8.2 环境(context)

    设置环境的方法也有3种:

    1. set,通用设置接口
    2. set_context,环境设置专用接口,设置后全局绘图环境随之改变
    3. plotting_context,设置当前图(axes级)的绘图环境,同时返回设置后的环境系列参数,支持with关键字用法
    sns.plotting_context("notebook")  # 默认
    sns.plotting_context("paper")
    sns.plotting_context("talk")
    sns.plotting_context("poster")
    

    在这里插入图片描述
    可以看出,4种默认绘图环境最直观的区别在于字体大小的不同,而其他方面也均略有差异。详细对比下4种绘图环境下的系列参数设置:

    在这里插入图片描述

    8.3 颜色(color_palette())

    seaborn风格多变的另一大特色就是支持个性化的颜色配置。颜色配置的方法有多种,常用方法包括以下两个:

    1. color_palette,基于RGB原理设置颜色的接口,可接收一个调色板对象作为参数,同时可以设置颜色数量
    2. hls_palette,基于Hue(色相)、Luminance(亮度)、Saturation(饱和度)原理设置颜色的接口,除了颜色数量参数外,另外3个重要参数即是hls

    同时,为了便于查看调色板样式,seaborn还提供了一个专门绘制颜色结果的方法palplot。
    在这里插入图片描述

    补充

    Seaborn入门详细教程

    展开全文
  • SonrLint常见解决方案

    万次阅读 2019-01-28 14:57:48
     Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测   Sonar可以从以下七个维度...

     

    • Sonar是什么?

       Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测

     

    Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题

     

    1. 不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写

     

    2. 潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷

     

    3. 糟糕的复杂度分布 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试

     

    4. 重复 显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示源码中重复严重的地方

     

    5. 注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷

     

    6. 缺乏单元测试 sonar可以很方便地统计并展示单元测试覆盖率

     

    7. 糟糕的设计  通过sonar可以找出循环,展示包与包、类与类之间相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。   

     

     

    更多代码分析工具可以查看:常用 Java 静态代码分析工具的分析与比较 https://www.oschina.net/question/129540_23043

     

    • SonrLint 安装与使用

            https://www.cnblogs.com/qiumingcheng/p/7253917.html

    • sonar 常见解决方案

    1.

    Parentheses should be removed from a single lambda input parameter when its type is inferred

    在推断单个lambda输入参数的类型时,应将其移除

     

     

    There are two possible syntaxes for a lambda having only one input parameter with an inferred type: with and without parentheses around that single parameter. The simpler syntax, without parentheses, is more compact and readable than the one with parentheses, and is therefore preferred.

    lambda有两种可能的语法,一种只有一个具有推断类型的输入参数:在该单个参数周围有括号,另一种没有括号。不带括号的简单语法比带括号的更紧凑、更易读,因此是首选语法。

     

    Compliant Solution(统一解决方案):

     这里将 (t) 的括号去掉即可

    2.

    String literals should not be duplicated  字符串文本不应重复


    Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.

    On the other hand, constants can be referenced from many places, but only need to be updated in a single place.

     

    重复的字符串文本使重构过程容易出错,因为必须确保更新所有出现的情况。

    另一方面,常数可以从许多地方引用,但只需要在一个地方更新。

     

    Compliant Solution(统一解决方案):

      相同的文本在多个地方使用的时候,需要统一定义同一个公共的常量参数

    3.

    Lambdas should be replaced with method references (lambda应替换为方法引用)

     

    Method/constructor references are more compact and readable than using lambdas, and are therefore preferred. Similarly, null checks can be replaced with references to the Objects::isNull and Objects::nonNull methods.

    Note that this rule is automatically disabled when the project's sonar.java.source is lower than 8.

     

    方法/构造函数引用比使用lambda更紧凑和可读,因此是首选的。类似地,可以将空检查替换为对 Objects::isNull 和 Objects::nonNull  方法的引用。

     

    请注意,当项目的sonar.java.source低于8时,此规则会自动禁用。

     

    Compliant Solution(统一解决方案):

      这里可以将 w -> w.getItemNumId() 改成 PosStyleSkuVO :: getItemNumId

    4.

    不应使用同步类vector、hashtable、stack和stringbuffer

    Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used

    不应使用Synchronized 类如: vector、hashtable、stack和stringbuffer

     

     

    Early classes of the Java API, such as Vector, Hashtable and StringBuffer, were synchronized to make them thread-safe. Unfortunately, synchronization has a big negative impact on performance, even when using these collections from a single thread.

     

    Java API的早期类,如vector、HasTabe和StringBuffer,被使用 synchronized 来使它们线程安全。但是不幸的是,同步对性能有很大的负面影响,即使在从单个线程使用这些集合时也是如此。

     

    It is better to use their new unsynchronized replacements:(最好使用新的非同步替换)

    使用ArrayList or LinkedList 来替代 Vector

    使用Deque 来替代 Stack

    使用HashMap 来替代 Hashtable

    使用StringBuilder 来替代 StringBuffer

     

     

    Compliant Solution(统一解决方案):

      这里可以可以使用 StringBuilder 而不是StringBuffer

    5.

    Unused method parameters should be removed (应删除未使用的方法参数)

     

    Unused parameters are misleading. Whatever the values passed to such parameters, the behavior will be the same.

    未使用的参数具有误导性。无论传递给这些参数的值是什么,行为都是相同的。

     

    Compliant Solution(统一解决方案):

      这里可以建议去除掉没有必要的参数

    6.

    Lamdbas containing only one statement should not nest this statement in a block

    仅包含一条语句的lamdba不应将此语句嵌套在块中

     

     

     

    There are two ways to write lambdas that contain single statement, but one is definitely more compact and readable than the other.

     

     

    有两种方法可以编写包含单个语句的lambda,但是一种方法绝对比另一种方法更紧凑和可读。

     

    Compliant Solution(统一解决方案):

      这里可以去除掉 {} 和后面的 ; 号

    7.

    Cognitive Complexity of methods should not be too high

    方法的认知复杂性不应太高。

     

     

    Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain.

    认知复杂性是衡量一种方法的控制流程理解难度的指标。认知复杂性高的方法难以别的开发人员去维护。

     

     

    Compliant Solution(统一解决方案):

      对应这种if-else 过多方法,我们主要目的是要消除 if-else ,每多一个 else 那么就会多一个逻辑分叉,代码的易读性会急速降低,这里收集总结了一些地址,需要的同学可以去看一下:

    减少该死的 if else 嵌套 
    java如何消除繁琐的if else 语句? 
    如何无痛降低 if else 面条代码复杂度 
    用设计模式来代替臃肿的ifelse层层判断 

    8.

    Map values should not be replaced unconditionally

    不应无条件替换映射值

     

    It is highly suspicious when a value is saved for a key or index and then unconditionally overwritten. Such replacements are likely in error.

     

    当为键或索引保存一个值,然后无条件地覆盖时,它是高度可疑的。这种替代品可能是错误的。

     

    Compliant Solution(统一解决方案):

       去除一个相同的key 的put

    9.

    Printf-style format strings should be used correctly

    应正确使用printf样式的格式字符串

     

    Because printf-style format strings are interpreted(编译解释) at runtime, rather than validated(使生效) by the compiler, they can contain errors that result in the wrong strings being created. This rule statically validates the correlation of printf-style format strings to their arguments when calling the format(...) methods of java.util.Formatter, java.lang.String, java.io.PrintStream, MessageFormat, and java.io.PrintWriter classes and the printf(...) methods of java.io.PrintStream or java.io.PrintWriter classes.

    因为 printf-style 格式字符串是在运行时编译解释的,而不是由编译时生效的,所以它们可能包含导致创建错误字符串的错误。当调用java.util.formatter、java.lang.string、java.io.printstream、messageformat和java.io.printwriter类的format(...)方法以及java.io.printstream或java.io.printwriter类的format(...)方法时,此规则静态地证实了 printf-style 的 字符串 和 其参数的相关性(这句话的说白了就是,string.format 方法的与其参数息息相关,参数和主体字符串关系具有一定的关系,不要乱来)

     

    Noncompliant Code Example (不符合的规则示例):

     

    1. String.format("First {0} and then {1}", "foo", "bar"); //Noncompliant. Looks like there is a confusion with the use of {{java.text.MessageFormat}}, parameters "foo" and "bar" will be simply ignored here  
    2. String.format("Display %3$d and then %d", 1, 2, 3); //Noncompliant; the second argument '2' is unused  
    3. String.format("Too many arguments %d and %d", 1, 2, 3); //Noncompliant; the third argument '3' is unused  
    4. String.format("First Line\n"); //Noncompliant; %n should be used in place of \n to produce the platform-specific line separator  
    5. String.format("Is myObject null ? %b", myObject); //Noncompliant; when a non-boolean argument is formatted with %b, it prints true for any nonnull value, and false for null. Even if intended, this is misleading. It's better to directly inject the boolean value (myObject == null in this case)
    6. String.format("value is " + value); // Noncompliant  
    7. String s = String.format("string without arguments"); // Noncompliant    
    8. MessageFormat.format("Result '{0}'.", value); // Noncompliant; String contains no format specifiers. (quote are discarding format specifiers)
    9. MessageFormat.format("Result {0}.", value, value); // Noncompliant; 2nd argument is not used  

    10> MessageFormat.format("Result {0}.", myObject.toString()); // Noncompliant; no need to call toString() on objects    

    11> java.util.Logger logger;

     logger.log(java.util.logging.Level.SEVERE, "Result {0}.", myObject.toString()); // Noncompliant; no need to call toString() on objects  

    1. logger.log(java.util.logging.Level.SEVERE, "Result.", new Exception()); // compliant, parameter is an exception  
    2. logger.log(java.util.logging.Level.SEVERE, "Result '{0}'", 14); // Noncompliant {{String contains no format specifiers.}}  
    3.  org.slf4j.Logger slf4jLog;

     org.slf4j.Marker marker;

    slf4jLog.debug(marker, "message {}");  

    slf4jLog.debug(marker, "message ", 1); // Noncompliant {{String contains no format specifiers.}}  

     

    Compliant Solution(统一解决方案):

      String.format("First %s and then %s", "foo", "bar");

    String.format("Display %2$d and then %d", 1, 3);

    String.format("Too many arguments %d %d", 1, 2);

    String.format("First Line%n");

    String.format("Is myObject null ? %b", myObject == null);

    String.format("value is %d", value);

    String s = "string without arguments";

    MessageFormat.format("Result {0}.", value);

    MessageFormat.format("Result '{0}' = {0}", value);

    MessageFormat.format("Result {0}.", myObject);

    java.util.Logger logger;

    logger.log(java.util.logging.Level.SEVERE,"Result{0}.",myObject);

    logger.log(java.util.logging.Level.SEVERE,"Result{0}'",14);

    org.slf4j.Logger slf4jLog;

    org.slf4j.Marker marker;

    slf4jLog.debug(marker, "message {}");

     slf4jLog.debug(marker, "message {}", 1);

    这里的异常是主体字符串标识符只有一个{},但是却有两个参数,这个是不符合规则的

    10.

    String function use should be optimized for single characters

    字符串函数的使用应针对单个字符进行优化

     

     

    An indexOf or lastIndexOf call with a single letter String can be made more performant by switching to a call with a char argument.

     

    使用 char 类型的参数可以提高单字母字符串的indexof或lastindexof调用的性能。

     

    Compliant Solution(统一解决方案):

       将result.indexOf(".") 改成 result.indexOf('.')

    11.

    Empty arrays and collections should be returned instead of null

    应返回空数组和集合,而不是 null

     

    Returning null instead of an actual array or collection forces callers of the method to explicitly test for nullity, making them more complex and less readable.

    Moreover, in many cases, null is used as a synonym for empty.

     

    返回null来替代 实际的数组或集合 会强制是该方法的”调用方”很明确的去测试为null的情况,从而使它们更复杂,可读性更低。此外,在许多情况下,null 也用作 empty 的同义词;

     

    Compliant Solution(统一解决方案):

    这里将return null; 改为Collections.emptyList();

    12.

     Collapsible "if" statements should be merged

    应该合并可折叠的“if”语句

     

     

    Merging collapsible if statements increases the code's readability.

     

    合并可折叠的if语句可以提高代码的可读性。

     

    Compliant Solution(统一解决方案):

    这里将:

    else if(shop.getType() == 2) {

    //过滤门店自定义无库存tab

    if(!filterNoGoodsTabBySearch(shop)) {

    continue;

    }

    }

    改为

    //过滤门店自定义无库存tab

    else if(shop.getType() == 2 && !filterNoGoodsTabBySearch(shop)) { continue;

    }

    这里其实不改的话 可读性更高点,具体要不要修改要视实际情况而定!

    13.

    Dead stores should be removed

    应移除废弃存储

     

    A dead store happens when a local variable is assigned a value that is not read by any subsequent instruction. Calculating or retrieving a value only to then overwrite it or throw it away, could indicate a serious error in the code. Even if it's not an error, it is at best a waste of resources. Therefore all calculated values should be used.

    当一个局部变量被分配一个值,而该值不被任何后续的指令读取时,就会发生死区。计算或检索一个值,然后覆盖或丢弃它,可能表示代码中存在严重错误。即使这不是一个错误,也充其量只是浪费资源。因此,应使用所有计算值。

     

    Compliant Solution(统一解决方案):

     这里将 Long[] memberIds =new Long[6];

    List<Long> ids = this.getRecentShopCommentMember(shopId);

    memberIds = new Long[ids.size()];

    memberIds = ids.toArray(memberIds);

    改为:    List<Long> ids = this.getRecentShopCommentMember(shopId);

    Long[] memberIds =  new Long[ids.size()];

    memberIds = ids.toArray(memberIds);

    14.

    Collection.isEmpty() should be used to test for emptiness

    collection.isEmpty()应用于测试是否为空

     

     

    Using Collection.size() to test for emptiness works, but using Collection.isEmpty() makes the code more readable and can be more performant. The time complexity of any isEmpty() method implementation should be O(1) whereas some implementations of size() can be O(n).

    使用collection.size()测试空性是可行的,但是使用collection.isEmpty() 可以使代码更可读,更具性能。任何isEmpty() 方法实现的时间复杂性都应该是O(1),而某些size() 的实现可以是O(n)。

     

    Compliant Solution(统一解决方案):

     这里工具建议使用 collection 的 isEmpty() 方法,但是实际上 collection 是否为null ,这个也是我们需要判断的,所以我们可以使用 CollectionUtils.isNotEmpty()方法

    Ps:

    list.size()>0 :

    list.size()>0这个方法会先计算一下list里元素的个数,然后再和0进行比较

    list.isEmpty()

    判断list里是否有元素,list不需要计算元素个数,直接看一下是否为空

    即查size时间复杂度是o(n) ,如果是empty o(1);所以判断集合是否为空一般用list.isEmpty()来判断;

    CollectionUtils.isEmpty() 正是如此

    另外对于某些明显已经实例化的collection ,我们其实也不用全部调用CollectionUtils.isEmpty 方法,这样依然能够满足需求

    15.

    布尔类型的返回值不需要去判断布尔文本

    16.

    Local variables should not be declared and then immediately returned  or thrown

    不应声明局部变量,然后立即返回或者抛出它

     

     

    Declaring a variable only to immediately return or throw it is a bad practice(实践;练习;惯例;)

    Some developers argue that the practice improves code readability, because it enables them to explicitly name what is being returned. However, this variable is an internal implementation detail that is not exposed to the callers of the method. The method name should be sufficient for callers to know exactly what will be returned.

     

    只声明一个变量以立即返回或抛出它是一种糟糕的惯例。

    一些开发人员认为该惯例提高了代码的可读性,因为它使他们能够显式地命名返回的内容。但是,该变量是一个内部实现细节,我们完全不需要向方法的调用方公开内部细节。而且方法名应该足以让调用方确切知道将返回什么。

     

    Compliant Solution(统一解决方案):

    将:

    Set<String> list = redisService.zreverage(key,0,5);

    return list;

    改为:

    return redisService.zreverage(key,0,5);

    17.

    The diamond operator ("<>") should be used

    应使用菱形运算符(“<>”)

     

    Java 7 introduced the diamond operator (<>) to reduce the verbosity of generics code. For instance, instead of having to declare a List's type in both its declaration and its constructor, you can now simplify the constructor declaration with <>, and the compiler will infer the type.

    Java 7引入了菱形运算符(<>)来减少泛型代码的冗长性。例如,不必在列表的声明和构造函数中同时声明列表的类型,现在可以用<>简化构造函数声明,编译器将推断该类型。

     

    Compliant Solution(统一解决方案):

    List<Long> ids = new ArrayList<>();

    18.

    The diamond operator ("<>") should be used

    应使用菱形运算符(“<>”)

     

    Java 7 introduced the diamond operator (<>) to reduce the verbosity of generics code. For instance, instead of having to declare a List's type in both its declaration and its constructor, you can now simplify the constructor declaration with <>, and the compiler will infer the type.

    Java 7引入了菱形运算符(<>)来减少泛型代码的冗长性。例如,不必在列表的声明和构造函数中同时声明列表的类型,现在可以用<>简化构造函数声明,编译器将推断该类型。

     

    Compliant Solution(统一解决方案):

    List<Long> ids = new ArrayList<>();

    19.

    用Arrays.asList() 方法得到的List的长度是不可改变的,

    当你向这个List添加或删除一个元素时(例如 list.add("d");)程序就会抛出异常:

    Arrays.asList()源码如下

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    这里需要注意这个new ArrayList<>(a)

    这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList

    它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法,对应的set add remove 方法如下:

    public E set(int index, E element) {
     throw new UnsupportedOperationException();
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    所以如果后续需要对该参数进行添加移除等操作的时候,就不要使用Arrays.asList() 了 ,老老实实用Lists.newArrayList()吧。

    20.

    "BigDecimal(double)" should not be used

    不应使用“BigDecimal(double)”。

    Because of floating point imprecision, you're unlikely to get the value you expect from the BigDecimal(double) constructor.

    由于浮点不精确,您不太可能从bigdecimal(double)构造函数获得预期的值。

    javase/7/docs

    The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.

     

    这个构造函数的结果可能有些不可预测。人们可以假设在Java中创建一个新的BigDeCimple(0.1)创建一个完全等于0.1的BigDecimal(一个未缩放的值为1,具有1的规模),但实际上它等于0.100000 000 000 000 555 1112312757 827 0211815834045 41015625。这是因为0.1不能精确地表示为一个双精度数(double)(或者就此而言,不能精确地表示为任何有限长度的二分之一)。因此,虽然看起来外观如此都是0.1,但是实际上传递给构造函数的值并不完全等于0.1。

     

     

    PS: 目前收集和整理了大概这些,后续还会不定期补充,这里为什么依然使用英文不用汉化版的插件,这里就不解释了,部分翻译是我根据自己的理解自己补充的,大家看看理解就行,不必太在意这个!

            整理不易,如果对你有帮助记得留个赞再走呀!!

    展开全文
  • selenium自动化常见问题及优化

    万次阅读 2016-05-30 14:40:48
    问题一:测试用例再...但是在自动化工程的实施过程中,高质量的自动化测试不是只有测试人员保证的。需要开发人员规范开发习惯,如给页面元素加上唯一的name,id等,这样就能大大地提高元素定位的准确性。当然如果开发
  • YUV RGB 常见视频格式解析

    千次阅读 2012-10-21 23:26:48
    YUV RGB 常见视频格式解析 I420是YUV格式的一种,而YUV有packed format(紧缩格式或者叫打包格式)和planar format(平面格式)两种,而I420属于planar format的一种。  同时I420表示了YUV的采样比例4:2:0。4:2...
  • 全网阅读过20k的Java集合框架常见面试题总结!

    千次阅读 多人点赞 2019-11-20 11:28:27
    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。...剖析面试最常见问题之Java集合框架 当了...
  • 常见的线程模型

    千次阅读 2018-10-15 18:47:46
    常见的线程模型 对于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低,降低了服务质量。 1、单线程...
  • 常见问题一:元素定位失败的问题 selenium是通过元素定位的方式找到需要的目标的,要完整的进行测试,就必须保证找到元素的定位准确。但是在自动化工程的实施过程中,高质量的自动化测试并不只是只能依靠测试人员...
  • 爬虫常见面试

    千次阅读 多人点赞 2019-06-12 20:30:05
    我们首先给爬虫一些start_urls,spider 最先访问 start_urls 里面的 url,再根据我们的 parse 函数,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,只需要在这个starts_urls里面做文章就行了...
  • 常见概率题

    千次阅读 2020-03-18 20:38:05
    证明:一个元素m被放入第i个位置的概率P = 前i-1个位置选择元素时没有选中m的概率 * 第i个位置选中m的概率,即: 疯子坐飞机问题 转自 100人坐飞机,第一个乘客在座位中随便选一个坐下,第100人正确坐到自己坐位的...
  • 常见聚类算法总结

    万次阅读 2018-09-07 17:12:55
    常见聚类算法总结 1.常见算法 1.原型聚类 “原型”是指样本空间中具有代表性的店。此类算法假设聚类结构能够通过一组原型刻画,通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解。–西瓜书 ...
  • C++ 常见错误

    千次阅读 2014-01-06 15:05:00
    C++ 常见错误 ���¼���ԭʼ��ҳ��ӡ 让你的C++代码变的更加强大_知识库_博客园  英文原文:Making Your C++ Code Robust  在实际的项目中,当项目的代码量不断增加的时候,...
  • 计算机常见单词

    万次阅读 多人点赞 2018-03-30 16:25:42
    1.单词说明:  command n. 命令,指令 [kə’mɑ:nd]  单词拼写 名词 单词含义 音标(发音)  提示:着重记忆单词对应的意思,有能力最好词性也记忆。 2.词性说明: n v vi vt conj prep pron adj adv ...
  • git常用命令与常见面试题总结

    千次阅读 2020-02-16 18:54:34
    git常用命令与常见面试题总结 git框架介绍 Workspace:开发者工作区 Index / Stage:暂存区/缓存区 Repository:仓库区(或本地仓库) Remote:远程仓库 列举工作中常用的几个git命令? 新增文件的命令:...
  • 软件质量模型

    千次阅读 2020-03-25 11:45:22
    常见质量模型: 基于经验的模型: 根据经验,使用典型的质量因素来构建一个多层质量模型。 层次模型: McCall质量模型: 也称GE模型,General Electrics Model,1977年,Jim A.McCall提出。 三层模型,自顶...
  • 常见视频编码格式解析

    万次阅读 多人点赞 2017-12-15 14:12:56
    常见视频编码格式解析 常见视频编码格式解析 1.MPEG2-TS编码技术 1.1.MPEG-TS简介 1.2.基本概念及TS流概述 1.3.基本流程 1.4.TS流传输包(简称TS包)结构分析 1.4.1.TS包包头 1.4.2.TS包净荷部分 1.5.PS节目流 ...
  • 常见用户行为分析模型解析

    千次阅读 2018-08-24 15:56:36
    比如访客、页面浏览量、停留时长都属于常见的指标 展示和点击 展示,指页面上元素的曝光次数。点击,指页面元素被用户点击的次数 访客 英文为 Visitor,通俗解释为访问网站或 App 的人。前面加上 Unique 后,即...
  • java常见考题(上)

    千次阅读 2017-09-26 18:50:15
    java常见考题
  • Sonar代码扫描常见规则总结

    千次阅读 2020-05-22 09:46:22
    Sonar代码扫描常见规则 最近公司项目交付,交付前...因此,如果项目交付需要进行代码质量扫描等工作,一定要将代码规范写进公司代码规范中,并严格遵守。 程序员啦,代码提交时,idea编辑工具的话,可以使用sonarLine插
  • 算法岗面试常见问题大集合

    万次阅读 多人点赞 2019-06-17 17:23:56
    1.参考博客 算法岗面试常见问题大集合
  • QML入门教程:三、QML基本元素

    千次阅读 2018-04-08 14:37:42
    QML 基本元素可以分为可视元素和不可视元素两类。可视元素(例如前面提到过的Rectangle)具有几何坐标,会在屏幕上占据一块显示区域。不可视元素(例如 Timer)通常提供一种功能,这些功能可以作用于可视元素。 ...
  • Final关键字 final 放在类前面 如果某个类在定义时,前面有修饰词final,则该类不能被继承 final 放在属性前面 属性声明时,如果前面有修饰词final关键字,则该属性值不能被更改,即此时该属性为常量 ...
  • OpenCV常见的优化方法和技巧总结

    万次阅读 多人点赞 2018-02-24 15:53:36
    OpenCV常见的优化方法和技巧总结 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/78540206 目录 OpenCV常见的优化方法和技巧总结 一、OpenCV常见的优化方法总结 1.1 cv::...
  • Air系列模块常见问题列表

    万次阅读 2021-04-26 15:24:42
    目录名称一、Luatools使用问题1.1 烧录下载  1.1.1、 2G模块无法烧录下载  1.1.2、 2G开发板无法烧录下载  1.1.3、4G模块(开发板)无法烧录下载  1.1.4、生成量产文件时的加密功能有什么用  1.1.5、4G开发模式...
  • 有些元素会在浮动元素的下方,但是这些元素的内容并不一定会被浮动的元素所遮盖,对内联元素进行定位时,这些元素会考虑浮动元素的边界,会围绕着浮动元素放置。也可以把浮动元素想象成是被块元素忽略的元素,而内联...
  • JS常见面试题

    万次阅读 2019-01-02 17:10:27
    把一个或者一组元素的事件委托到它的父层或者更外层元素上优点,减少内存消耗,动态绑定事件target 是触发事件的最具体的元素,currenttarget是绑定事件的元素(在函数中一般等于this)JavaScript 事件委托详解 ...
  • WAP常见问题问答大全

    万次阅读 2007-09-21 15:23:00
    目录 一、 关于WAP的常见问答二、 关于WML的常见问答三、 关于WAP开发的常见问答四、关于WMLScript的常见问答五、关于WBMP的常见问答六、关于WAP网关的常见问答七、关于WAP浏览器的常见问答八、关于WAP手机的...
  • 常见算法时间复杂度

    千次阅读 2015-04-09 16:51:44
    同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。 一、时间复杂度 (1)时间...
  • UML的结构和模型元素

    千次阅读 2020-03-05 12:43:02
    为了尽可能完成高质量、高效率的分析,分析过程应遵循如下原则: (1)抽象原则(2)分类原则(3)聚合原则(4)关联原则(5)消息通信原则 2、了解什么是UML语言 UML是一种通用的标准的建模语言,其本身具有的扩展...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,346
精华内容 20,938
关键字:

常见元素质量