整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

盘点12个Python数据可视化库,通吃任何领域

盘点12个Python数据可视化库,通吃任何领域


数据可视化的研究热潮中,如何让数据生动呈现,成了一个具有挑战性的任务,随之也出现了大量的可视化软件。相对于其他商业可视化软件,Python是开源且免费的,而且具有易上手、效果好的优点。

大家普遍第一次接触到的Python数据可视化库基本上都是Matplotlib。Python还有很多数据可视化库,本文盘点了12款常用的Python数据可视化库,挑选适合自己业务的那一款吧!

深入学习Python商业数据可视化技术,推荐阅读《Python商业数据可视化实战》

Python有很多数据可视化库,这些数据可视化库主要分为探索式可视化库交互式可视化库。前者透过简单直接的视觉图形,更方便用户看懂原数据,后者主要用于与业务结合过程中展现总体分析结果。

探索式可视化库

探索式分析最大的优势在于,可以让业务人员在海量数据中“自由发挥”,不受数据模型的限制。通过探索式分析和可视化,业务人员可以快速发现业务中存在的问题。

Python探索式可视化库主要包括如下几个。


1Matplotlib

Matplotlib是Python数据可视化库的元老,尽管它已有十多年的历史,但仍然是Python社区中使用最广泛的绘图库,编写几行代码即可生成线图、直方图、功率谱密度图、条形图、错误图、散点图等。

Python的可视化库众多,各有各的特点,但是Matplotlib是一个非常基础的Python可视化库,如果需要学习Python数据可视化,那么Matplotlib是非学不可的,之后再学习其他库就比较简单了。Matplotlib的中文学习资料比较丰富,其中最好的学习资料是其官方网站的帮助文档,大家可以在上面查阅自己感兴趣的内容。


2Seaborn

Seaborn利用Matplotlib的强大功能,只用几行代码就能创建出漂亮的图表。它们的关键区别在于,Seaborn的默认款式和调色板设计更加美观和现代。由于Seaborn是在Matplotlib基础上构建的,因此用户还需要了解Matplotlib以便调整Seaborn的默认值。

Seaborn同Matplotlib一样,也是Python进行数据可视化分析的重要第三方包。

Seaborn在Matplotlib的基础上进行了更高级的API封装,使用户绘图更加容易,所绘图形更加漂亮。Seaborn是基于Matplotlib的一个模块,专用于统计可视化,可以和Pandas进行无缝连接,使可视化的初学者更容易上手。

相对于Matplotlib,Seaborn语法更简洁,两者的关系类似于Numpy和Pandas的关系。但是需要注意的是,应该把Seaborn视为Matplotlib的补充,而不是替代物。

Seaborn库旨在以数据可视化为中心来挖掘与理解数据,它提供的面向数据集制图函数主要是对行列索引和数组的操作,包含对整个数据集进行内部的语义映射与统计整合,以此生成信息丰富的图表。


3Pyecharts

Pyecharts是我国开发人员开发的,相比较Matplotlib、Seaborn等可视化库,Pyecharts十分符合国内用户的使用习惯。

Pyecharts的目的是实现Echarts与Python的对接,以便在Python中使用Echarts生成图表。

Echarts是百度开源的一个数据可视化JavaScript库,生成的图的可视化效果非常好,其凭借良好的交互性,精巧的图表设计,得到了众多开发者的认可


4Missingno

处理缺失的数据是一件让人痛苦的事,Missingno通过使用视觉摘要来快速评估数据集的完整性,而不是通过大篇幅的表格。它可以根据热力图或树状图的完成度或点的相关度对数据进行过滤和排序。


交互式可视化库

数据可视化可以是静态的也可以是交互的,交互式的数据可视化是指人们使用计算机和移动设备深入图表和图形的具体细节,然后用交互的方式改变他们看到的数据。Python交互式可视化库主要包括如下几个。


1Bokeh

Bokeh基于JavaScript实现交互式可视化,它是原生Python语法,它可以在Web浏览器中实现美观的视觉效果。

它的优势在于能够创建交互式的网站图,可以很容易地将数据输出为JSON对象、HTML文档或交互式Web应用程序。Bokeh还支持流媒体和实时数据。

但是它也有明显的缺点:一是版本时常更新,最重要的是有时语法不向下兼容,这对于开发者来说是噩梦;二是语法晦涩,与Matplotlib相比,可以说是有过之而无不及。


2HoloViews

HoloViews是一个开源的Python库,旨在使数据分析和可视化更加简便,可以用非常少的代码行完成数据分析和可视化。

除了默认的Matplotlib后端,它还添加了一个Bokeh后端。结合Bokeh提供的交互式小部件,可以使用HTML5和WebGL快速生成交互式视图,以及进行高维数据的可视化探索。


3Plotly

Plotly是一个数据可视化的在线平台,与Bokeh一样,Plotly的强项在于制作交互式视图,但它提供了一些在大多数库中没有的图表,如等高线图、树状图和3D图表。可以在线绘制条形图、散点图、饼图、直方图等多种图形,可以画出很多媲美Tableau的高质量图。

Plotly支持在线编辑图形,支持Python、JavaScript、MATLAB和R等多种语言的API。Plotly生成的所有图表实际上都是由JavaScript产生的,无论是在浏览器还是在Jupyter中,所有的可视化、交互都是基于plotly.js的,它是一个高级的声明性图表库,提供了20多种图表类型,包含3D图表、统计图和SVG地图等。


4pygal

与Bokeh和Plotly一样,pygal提供了可以嵌入Web浏览器的交互式视图。区别在于,它能够将图表输出为SVG格式。如果用户使用较小的数据集,则输出位SVG格式的图像就可以了,但是如果用户制作的图表包含数十万个数据点,那么它们就会很难被渲染并变得反应迟钝。

Pygal绘制线图的方法很简单,可以将图表渲染为一个SVG文件,用户使用浏览器打开SVG文件就可以查看生成的图表。


5plotnine

plotnine是Python中图形语法的一种实现,它基于ggplot2包,语法绘图功能强大,可以轻松将数据映射到构成图的可视对象,然后创建自定义的图形。plotnine提供各种不同的可视化视图,易于适应定制化输出,安装十分简单,用户可以通过pip install plotnine命令直接安装。

plotnine的优点为代码简洁,易学;绘制出的图流畅大方;不需要很多的代码就可以绘制出很不错的图。在使用plotnine绘图之前,首先需要理解绘图的基本概念。


6Altair

Altair是一个专为Python编写,它可以让数据科学家更多地关注数据本身和其内在的联系。

因为是基于Vega-Lite(交互式图形语法)的声明性统计可视化库,Altair API具有简单、友好、一致等特点。

声明意味着用户只需要提供数据列与编码通道之间的链接,例如,x轴、y轴、颜色等,其余的绘图细节它会自动处理。声明使Altair变得简单、友好和一致,用户使用Altair可以轻松设计出有效且美观的可视化代码。


7ggplot

ggplot是基于R语言的ggplot2包和Python的绘图系统。ggplot的运行方式与Matplotlib不同,它允许用户对组件进行分层以创建完整的绘图。例如,用户可以从轴开始画,然后添加点,接着添加线、趋势线等。虽然图形语法被认为是绘图的“直观”方法,但经验丰富的Matplotlib用户可能需要时间来适应这个新的方式。


8Gleam

Gleam的灵感来自R语言的Shiny包。它允许用户仅使用Python脚本就可将分析结果转换为交互式Web应用程序,因此用户不必了解任何其他语言,如HTML、CSS或JavaScript。Gleam适用于任何Python数据可视化库。在创建绘图后,用户可以在它的上面添加字段,以便对数据进行筛选和排序。


图书推荐

▊《Python商业数据可视化实战(全彩)》

王国平 著

  • 通过可视化分析,更好地挖掘数据的价值
  • 既包括操作方法和技巧,又融入了数据可视化实战案例
  • 本书由浅入深、循序渐进地介绍了基于Python的商业数据可视化技术,并结合实际案例详细介绍了Python在数据可视化方面的具体应用。

    重点介绍了Python的9个可视化库,分别为Matplotlib、Seaborn、Pyecharts、Bokeh、HoloViews、Plotly、Pygal、plotnine、Altair,并介绍了商业数据可视化的思维。读者通过学习本书,能够轻松、快速地掌握商业数据可视化技术。

    者:dataplusscience

    翻译:和中华

    校对:丁楠雅

    本文约2000字,建议阅读8分钟。

    本文介绍了Tableau中如何把箱形图和单位直方图分离。



    Steve Wexler在他最近的一篇博客文章《Is this better than a Jitterplot? Could be》中探索了可视化jitterplot图(带有随机jitter的点图,jitter用来区分点)的替代方法:

    博客文章链接:https://www.datarevelations.com/betterthanjitterplot.html

    在本文中,我将展示如何创建与单位直方图(unit histogram)区分的箱形图(box plot)。

    译者注:jitter是一个随机值,分配给点用来将其区分,这样就不会重叠了,详细内容可以参见下面这篇文章:Methods for Creating Jitter in Tableau:https://www.dataplusscience.com/TableauJitter.html

    单位直方图

    史蒂夫在他的帖子以及另一篇文章”Tableau visualization is here“中描述了如何制作单位直方图:

    Tableau visualization is here:https://public.tableau.com/profile/swexler

    我将用它作为此文章的起点,因此如果您想跟着练习,请在此处下载他的workbook:

    下载链接:https://public.tableau.com/workbooks/DataRevelations_MeVsOthers_UnitHistogram.twb

    这是史蒂夫做的单位直方图:



    删除分步带(distribution bands)并添加箱形图

    下载并打开Steve的Tableau workbook后,右键单击主仪表板选项卡“Salary Comparison Jitterplot Dashboard(2)”并选择“Unhide All Sheets”。

    转到名为Breakout with Quartiles的工作表。单击分布带中的线并将其拖离Tableau Canvas。另一种方法是右键单击该线并选择“删除”。对分步带也重复此步骤。您现在应该得到了一个没有分布带的单位直方图。

    单击左上角的“分析”选项卡。单击并将箱形图拖动到Tableau canvas并将其放在SUM(continuous Bin)上。这将为单位直方图添加一个箱形图。

    这很简单,但请注意,箱形图的中心位于窗格中并覆盖了一些点。



    让我们探讨一些将箱形图移开的办法。

    改变箱形图的位置

    第一种方法是通过创建更多点来移动箱形图。我们将通过创建另一个胶囊(pill)并使用双轴来实现这一目标:

    双击INDEX() 胶囊右侧白色区域的Column Shelf。这将允许您输入行内公式。输入-20并按Enter键。右键单击新胶囊并选择“Dual Axis”。右键单击图表顶部的新二级X轴,然后选择“Synchronize Axis”。 在SUM(-20)的标记卡上,单击颜色并将不透明度设置为0%,将边框设置为“None”。

    您现在应该得到了一个单位直方图,它从箱形图的中心开始。



    但是,您会注意到许多点仍然隐藏在箱形图的后面。您可以将X轴更改为固定以调整位置,但我认为很难以不与点重叠并能显示所有点的方式固定箱形图的位置。

    将箱形图与单位直方图分开

    分离箱形图和点图的最明显方法是为每个箱形图和单位直方图创建工作表。在本例中,有四代,所以将有八个工作表。这种方法允许您为每一代创建一个不同的视图,一个带有箱形图,另一个带有单位直方图,并且可以非常直接地复制整个工作表并相应地调整过滤器以创建每个视图。但这并不是一个好办法,当你有更多类别时,很快就会变得笨拙。

    另一种分离它们的方法是复制数据。这可以使用自定义SQL,Tableau Prep,Alteryx或在原始数据源中预处理来完成。为了便于演示,您可以在此处下载重复的数据:

    下载链接:https://www.dataplusscience.com/files/BoxandUnitHisto.xlsx

    此电子表格只是简单地复制原始数据并带有一个名为“Column”的新列。第一组数据在此新列中具有值“box”,第二组数据具有值“dots”。

    从顶部菜单中选择“Data”,然后选择“New Data Source”。选择“Microsoft Excel”并选择您下载的文件"BoxandUnitHisto.xlsx"。这将打开新的数据源。再次单击"Breakout with quartiles"选项卡来返回Tableau canvas。再次从顶部菜单中选择“Data”,然后选择“Replace Data Source”。“Current:”数据源应设置为"Reshaped Survey Data",“Replacement:”数据源应设置为"Sheet1(BoxandUnitHisto)"

    这将使用复制了所有记录的新数据源替换原来的单个数据源,并具有一个名为“Column”的新字段。

    复制数据集的一个大问题是计算可能会受到影响。例如,Continuous Bin,它是Y轴上的主要字段,现在已经翻倍了。有很多方法可以解决这个问题,但是我们将对此进行简单的修复,即将数字除以2。注意这可能不是所有情况下的最佳解决方案:

    右键单击Continuous Bin并将/ 2添加到公式中,以便该值除以2。 在Breakdown之后将Column胶囊拖到Column shelf上。向上拖动SUM(-20)离开canvas以删除胶囊或右键单击并选择“Remove”。 右键单击Continuous Bin并选择“Duplicate” 右键单击新字段Continuous胶囊(copy)并选择“Edit” 调整公式:IF [Column]='box' then INT([Value] / [Bin Size])* [Bin Size] / 2 ELSE null END 将新的Continuous胶囊(copy)拖动到“Continuous Bin”旁边的Rows shelf 右键单击Continuous胶囊(copy)并选择“Dual Axis” 右键单击右侧的新二级Y轴,然后选择“Synchronize Axis” 将Dots窗格中的箱形图从Tableau Canvas中拖出以将其删除,或者右键单击Dots窗格中的箱形图并选择“Remove”

    现在,您将拥有一个仅在标有“box”的左窗格窗口中的箱形图,而不是标记为“dots”的第二个窗格。让点在“box”窗格中消失有点棘手。我想你会发现不透明度,颜色,边框和尺寸在此刻都不起作用。所以我们将创建另外两个字段来处理这个问题:

    计算字段:Col Num公式:IF [Column]='box' THEN 0 ELSE 1 END 计算字段:Count公式:IF avg([Col Num])=0 THEN null ELSE index()END 使用新字段Count替换Column shelf上的INDEX()右键单击Column shelf上的Count,然后选择“Compute Using”并将其设置为“Resp ID”

    您现在应该在第一个列窗格中有一个箱形图,在第二个列窗格中有一个单位直方图。其余的只是根据需要进行格式化:



    在图表区域中单击鼠标右键,然后选择“Format” 选择“Borders”并将“Column Divider Level:”向左滑动一个位置。 右键在二级Y轴的Continuous胶囊(copy)点击并取消选中“Show Header”以删除 右键单击带有“box”和“dots”的列标题,然后取消选中“Show Header”以删除根据需要调整点的颜色。



    复制数据肯定会有缺点,但是,这里的最终结果是一个不与单位直方图重叠的箱形图,并且与在点的顶部绘制的典型箱形图相比具有一些优点。这种方法也可以用于分布带。只需用分布带替换箱形图窗格。



    这也可以与jitterplot一起使用,但我发现单位直方图比使用jitter随机放置点更有用。



    我希望这篇文章对您有所帮助。如果您有任何问题,请随时给我发电子邮件Jeff@DataPlusScience.com

    原文标题:

    How to Separate a Box Plot and Unit Histogram in Tableau

    原文链接:

    https://www.dataplusscience.com/BoxandUnitHisto.html

    译者简介

    和中华,留德软件工程硕士。由于对机器学习感兴趣,硕士论文选择了利用遗传算法思想改进传统kmeans。目前在杭州进行大数据相关实践。加入数据派THU希望为IT同行们尽自己一份绵薄之力,也希望结交许多志趣相投的小伙伴。

    于数据分析师来说,数据获取通常有两种方式,一种是直接从系统本地获取数据,另一种是爬取网页上的数据,爬虫从网页爬取数据需要几步?总结下来,Python爬取网页数据需要发起请求、获取响应内容、解析数据、保存数据共计4步。

    本文使用Python爬取去哪儿网景点评论数据共计100条数据,数据爬取后使用Tableau Public软件进行可视化分析,从数据获取,到数据清洗,最后数据可视化进行全流程数据分析,下面一起来学习。

    示例工具:anconda3.7

    本文讲解内容:数据获取、数据可视化

    适用范围:网页数据获取及评论分析

    网页数据爬取

    Python爬取网页数据需要发起请求、获取响应内容、解析数据、保存数据共计4步,懂的数据爬取的原理后,进行数据爬取。

    1、发起请求

    以去哪儿旅行网站为例,爬取网页数据,首先发送请求。

    import requests
    u='https://travel.qunar.com/p-cs300100-xian-jingdian'#爬取网址
    response=requests.get(u)
    print('状态码:{}'.format(response.status_code))
    if response.status_code !=200:
       pass
    else:
       print("服务器连接正常")

    这里返回状态码为200,说明服务器连接正常,可以进行数据爬取。

    2、获取响应内容

    服务器连接正常后,直接打印返回内容,这里返回整个网页html。

    print(response.text)

    3、解析数据

    网页结构由复杂的html语言构成,这里借助BeautifulSoup库进行解析。

    from bs4 import BeautifulSoup
    
    
    ri=requests.get(url=u)
    soupi=BeautifulSoup(ri.text,'lxml')#解析网址
    ul=soupi.find('ul',class_='list_item clrfix')
    lis=ul.find_all('li')
    lis

    对于特定的标签进行定位,输出text。

    print(soupi.h1.text)#标签定位,输出text
    lis=ul.find_all('li')
    print(lis[0].text)

    建立一个字典,解析目标标签内容。

    li1=lis[0]
    dic={}
    dic['景点名称']=li1.find('span',class_="cn_tit").text
    dic['攻略提到数量']=li1.find('div',class_="strategy_sum").text
    dic['评论数量']=li1.find('div',class_="comment_sum").text
    dic['lng']=li['data-lng']
    dic['lat']=li['data-lat']
    dic

    使用for循环解析标签内容。

    import requests
    from bs4 import BeautifulSoup
    u1='https://travel.qunar.com/p-cs300100-xian-jingdian'
    ri=requests.get(url=u1)
    
    soupi=BeautifulSoup(ri.text,'lxml')#解析网址
    ul=soupi.find('ul',class_='list_item clrfix')
    lis=ul.find_all('li')
    for li in lis:
        dic={}
        dic['景点名称']=li.find('span',class_="cn_tit").text
        dic['攻略提到数量']=li.find('div',class_="strategy_sum").text
        dic['评论数量']=li.find('div',class_="comment_sum").text
        dic['lng']=li['data-lng']
        dic['lat']=li['data-lat']
    print(dic)

    根据翻页规律设置翻页数,这里设置一个列表,用来循环爬取前十页数据。

    #根据翻页规律,设置翻页数
    urllst=[]
    for i in range(11):
        urllst.append('https://travel.qunar.com/p-cs300100-xian-jingdian'+str('-1-')+str(i))
        urllst=urllst[2:11]
        urllst.append('https://travel.qunar.com/p-cs300100-xian-jingdian')
    urllst

    4、保存数据

    新建一个空的数据框,用于保存数据。

    import pandas as pd
    dic=pd.DataFrame(columns=["景点名称", "攻略提到数量", "评论数量", "lng", "lat"])
    dic

    在空的数据框中保存第一条数据,并且使用for循环,依次爬取其余页面的数据。