头图

【万字总结】推荐几个常用数据可视化第三方库(附源码,建议收藏)

前言

数据可视化的第三方库挺多的,这里我主要推荐三个,分别是 Pygal、Bokeh、Plotly,废话不多说,直接上~~

推荐

数据可视化的库有挺多的,这里推荐几个比较常用的:

  • Matplotlib
  • Pygal
  • Bokeh
  • Seaborn
  • Ggplot
  • Plotly
  • Pyechart

Pygal

pygal官网地址(http://www.pygal.org/en/stable/

在这里插入图片描述

安装pygal模块

pygal模块的安装非常简单,只需输入一行pip命令即可

1 pip install pygal

安装完成:
在这里插入图片描述

pygal模块介绍

pygal是Python的第三方库,他的主要功能就是数据可视化,即将数字转化成图表的形式来呈现,它提供的图表样式有柱状图、折线图、饼状图、雷达图......

柱状图
单列柱状图
import pygal

view = pygal.Bar()
#图表名
view.title = '柱状图'
#添加数据
view.add('numbers', [0,2,4,6,8,10])
#在浏览器中查看
#view.render_in_browser()
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')

效果图:
在这里插入图片描述
注意:svg图片用系统自带的图片查看器打开可能会显示全黑色,可以尝试使用Google浏览器打开

多列柱状图
#添加数据
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])

在这里插入图片描述

堆叠柱状图
view = pygal.StackedBar()

在这里插入图片描述

横向柱状图
view = pygal.HorizontalStackedBar()

在这里插入图片描述

折线图

简单折线图
import pygal

view = pygal.Line()
#图表名
view.title = '折线图'
#添加数据
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])
#在浏览器中查看
#view.render_in_browser()
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')

效果图:
在这里插入图片描述

纵向折线图
view = pygal.HorizontalLine()

在这里插入图片描述

堆叠折线图
view = pygal.StackedLine(fill=True)

在这里插入图片描述

饼状图

简单饼状图
import pygal

view = pygal.Pie()
#图表名
view.title = '饼状图'
#添加数据
view.add('A', 31)
view.add('B', 55)
view.add('C', 14)
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')

效果图:
在这里插入图片描述

多级饼状图
#添加数据
view.add('A', [31,25])
view.add('B', [55,38])
view.add('C', [14,37])

在这里插入图片描述

圆环图
#设置空心圆半径
view = pygal.Pie(inner_radius=0.4)

在这里插入图片描述

半圆图
view = pygal.Pie(half_pie=True)

在这里插入图片描述

雷达图

基础雷达图

import pygal

view = pygal.Radar()
#图表名
view.title = '雷达图'
#添加数据(可以为任意个)
view.add('A', [31,56,34,67,34])
view.add('B', [23,18,57,45,35])
view.add('C', [14,45,76,34,76])
#保存为view.svg(也可以保存为jpg)
view.render_to_file('view.svg')

效果图:
在这里插入图片描述

plotly

plotly 文档地址(https://plot.ly/python/#finan...

Plotly 是一款用来做数据分析和可视化的在线平台,功能非常强大,可以在线绘制很多图形比如条形图、散点图、饼图、直方图等等。而且还是支持在线编辑,以及多种语言python、javascript、matlab、R等许多API。它在python中使用也很简单,直接用pip install plotly就可以了。推荐最好在jupyter notebook中使用,pycharm操作不是很方便。使用Plotly可以画出很多媲美Tableau的高质量图:

图片
这里尝试做了折线图、散点图和直方图,代码如下:
首先导入库

from plotly.graph_objs import Scatter,Layout
import plotly
import plotly.offline as py
import numpy as np
import plotly.graph_objs as go

#setting offilne
plotly.offline.init_notebook_mode(connected=True)

上面几行代码主要是引用一些库,plotly有在线和离线两种模式,在线模式需要有账号可以云编辑。我选用的离线模式,plotly设置为offline模式就可以直接在notebook里面显示了。

1.制作折线图
N = 100
random_x = np.linspace(0,1,N)
random_y0 = np.random.randn(N)+5
random_y1 = np.random.randn(N)
random_y2 = np.random.randn(N)-5

#Create traces
trace0 = go.Scatter(
    x = random_x,
    y = random_y0,
    mode = 'markers',
    name = 'markers'
)
trace1 = go.Scatter(
    x = random_x,
    y = random_y1,
    mode = 'lines+markers',
    name = 'lines+markers'
)
trace2 = go.Scatter(
    x = random_x,
    y = random_y2,
    mode = 'lines',
    name = 'lines'
)
data = [trace0,trace1,trace2]
py.iplot(data)

在这里插入图片描述

随机设置4个参数,一个x轴的数字和三个y轴的随机数据,制作出三种不同类型的图。trace0是markers,trace1是lines和markers,trace3是lines。然后把三种图放在data这个列表里面,调用py.iplot(data)即可。
绘制的图片系统默认配色也挺好看的~

2.制作散点图
trace1 = go.Scatter(
     y = np.random.randn(500),
    mode = 'markers',
    marker = dict(
        size = 16,
        color = np.random.randn(500),
        colorscale = 'Viridis',
        showscale = True
    )
)
data = [trace1]
py.iplot(data)

把mode设置为markers就是散点图,然后marker里面设置一组参数,比如颜色的随机范围,散点的大小,还有图例等等。
散点图.png

3.直方图
trace0 = go.Bar(
    x = ['Jan','Feb','Mar','Apr', 'May','Jun',
         'Jul','Aug','Sep','Oct','Nov','Dec'],
    y = [20,14,25,16,18,22,19,15,12,16,14,17],
    name = 'Primary Product',
    marker=dict(
        color = 'rgb(49,130,189)'
    )
)
trace1 = go.Bar(
    x = ['Jan','Feb','Mar','Apr', 'May','Jun',
         'Jul','Aug','Sep','Oct','Nov','Dec'],
    y = [19,14,22,14,16,19,15,14,10,12,12,16],
    name = 'Secondary Product',
    marker=dict(
        color = 'rgb(204,204,204)'
    )
)
data = [trace0,trace1]
py.iplot(data)

在这里插入图片描述

Bokeh

条形图

这配色看着还挺舒服的,比 pyecharts 条形图的配色好看一点。
在这里插入图片描述

from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource
from bokeh.palettes import Spectral6
from bokeh.plotting import figure
output_file("colormapped_bars.html")#  配置输出文件名
fruits = ['Apples', '魅族', 'OPPO', 'VIVO', '小米', '华为'] # 数据
counts = [5, 3, 4, 2, 4, 6] # 数据
source = ColumnDataSource(data=dict(fruits=fruits, counts=counts, color=Spectral6))
p = figure(x_range=fruits, y_range=(0,9), plot_height=250, title="Fruit Counts",
           toolbar_location=None, tools="")# 条形图配置项
p.vbar(x='fruits', top='counts', width=0.9, color='color', legend="fruits", source=source)
p.xgrid.grid_line_color = None # 配置网格线颜色
p.legend.orientation = "horizontal" # 图表方向为水平方向
p.legend.location = "top_center"
show(p) # 展示图表

年度条形图

可以对比不同时间点的量。
在这里插入图片描述

from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure
output_file("bars.html") # 输出文件名
fruits = ['Apple', '魅族', 'OPPO', 'VIVO', '小米', '华为'] # 参数
years = ['2015', '2016', '2017'] # 参数
data = {'fruits': fruits,
        '2015': [2, 1, 4, 3, 2, 4],
        '2016': [5, 3, 3, 2, 4, 6],
        '2017': [3, 2, 4, 4, 5, 3]}
x = [(fruit, year) for fruit in fruits for year in years]
counts = sum(zip(data['2015'], data['2016'], data['2017']), ())  
source = ColumnDataSource(data=dict(x=x, counts=counts))
p = figure(x_range=FactorRange(*x), plot_height=250, title="Fruit Counts by Year",
           toolbar_location=None, tools="")
p.vbar(x='x', top='counts', width=0.9, source=source)
p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
show(p)

饼图

在这里插入图片描述

from collections import Counter
from math import pi
import pandas as pd
from bokeh.io import output_file, show
from bokeh.palettes import Category20c
from bokeh.plotting import figure
from bokeh.transform import cumsum
output_file("pie.html")
x = Counter({
    '中国': 157,
    '美国': 93,
    '日本': 89,
    '巴西': 63,
    '德国': 44,
    '印度': 42,
    '意大利': 40,
    '澳大利亚': 35,
    '法国': 31,
    '西班牙': 29
})
data = pd.DataFrame.from_dict(dict(x), orient='index').reset_index().rename(index=str, columns={0:'value', 'index':'country'})
data['angle'] = data['value']/sum(x.values()) * 2*pi
data['color'] = Category20c[len(x)]
p = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
           tools="hover", tooltips="@country: @value")
p.wedge(x=0, y=1, radius=0.4,
        start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
        line_color="white", fill_color='color', legend='country', source=data)
p.axis.axis_label=None
p.axis.visible=False
p.grid.grid_line_color = None
show(p)

条形图

from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource
from bokeh.palettes import GnBu3, OrRd3
from bokeh.plotting import figure
output_file("stacked_split.html")
fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ["2015", "2016", "2017"]
exports = {'fruits': fruits,
           '2015': [2, 1, 4, 3, 2, 4],
           '2016': [5, 3, 4, 2, 4, 6],
           '2017': [3, 2, 4, 4, 5, 3]}
imports = {'fruits': fruits,
           '2015': [-1, 0, -1, -3, -2, -1],
           '2016': [-2, -1, -3, -1, -2, -2],
           '2017': [-1, -2, -1, 0, -2, -2]}
p = figure(y_range=fruits, plot_height=250, x_range=(-16, 16), title="Fruit import/export, by year",
           toolbar_location=None)
p.hbar_stack(years, y='fruits', height=0.9, color=GnBu3, source=ColumnDataSource(exports),
             legend=["%s exports" % x for x in years])
p.hbar_stack(years, y='fruits', height=0.9, color=OrRd3, source=ColumnDataSource(imports),
             legend=["%s imports" % x for x in years])
p.y_range.range_padding = 0.1
p.ygrid.grid_line_color = None
p.legend.location = "top_left"
p.axis.minor_tick_line_color = None
p.outline_line_color = None
show(p)

散点图

在这里插入图片描述

from bokeh.plotting import figure, output_file, show
output_file("line.html")
p = figure(plot_width=400, plot_height=400)
p.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)
show(p)

六边形图

这两天,马蜂窝刚被发现数据造假,这不,与马蜂窝应应景。
在这里插入图片描述

import numpy as np
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.util.hex import axial_to_cartesian
output_file("hex_coords.html")
q = np.array([0, 0, 0, -1, -1, 1, 1])
r = np.array([0, -1, 1, 0, 1, -1, 0])
p = figure(plot_width=400, plot_height=400, toolbar_location=None) # 
p.grid.visible = False # 配置网格是否可见
p.hex_tile(q, r, size=1, fill_color=["firebrick"] * 3 + ["navy"] * 4,
           line_color="white", alpha=0.5)
x, y = axial_to_cartesian(q, r, 1, "pointytop")
p.text(x, y, text=["(%d, %d)" % (q, r) for (q, r) in zip(q, r)],
       text_baseline="middle", text_align="center")
show(p)

环比条形图

这个实现挺厉害的,看了一眼就吸引了我。我在代码中都做了一些注释,希望对你理解有帮助。注:圆心为正中央,即直角坐标系中标签为(0,0)的地方。
在这里插入图片描述

from collections import OrderedDict
from math import log, sqrt
import numpy as np
import pandas as pd
from six.moves import cStringIO as StringIO
from bokeh.plotting import figure, show, output_file

antibiotics = """
bacteria,                        penicillin, streptomycin, neomycin, gram
结核分枝杆菌,                      800,        5,            2,        negative
沙门氏菌,                         10,         0.8,          0.09,     negative
变形杆菌,                         3,          0.1,          0.1,      negative
肺炎克雷伯氏菌,                    850,        1.2,          1,        negative
布鲁氏菌,                         1,          2,            0.02,     negative
铜绿假单胞菌,                     850,        2,            0.4,      negative
大肠杆菌,                        100,        0.4,          0.1,      negative
产气杆菌,                         870,        1,            1.6,      negative
白色葡萄球菌,                     0.007,      0.1,          0.001,    positive
溶血性链球菌,                     0.001,      14,           10,       positive
草绿色链球菌,                     0.005,      10,           40,       positive
肺炎双球菌,                       0.005,      11,           10,       positive
"""

drug_color = OrderedDict([# 配置中间标签名称与颜色
    ("盘尼西林", "#0d3362"),
    ("链霉素", "#c64737"),
    ("新霉素", "black"),
])
gram_color = {
    "positive": "#aeaeb8",
    "negative": "#e69584",
}
# 读取数据
df = pd.read_csv(StringIO(antibiotics),
                 skiprows=1,
                 skipinitialspace=True,
                 engine='python')
width = 800
height = 800
inner_radius = 90
outer_radius = 300 - 10

minr = sqrt(log(.001 * 1E4))
maxr = sqrt(log(1000 * 1E4))
a = (outer_radius - inner_radius) / (minr - maxr)
b = inner_radius - a * maxr


def rad(mic):
    return a * np.sqrt(np.log(mic * 1E4)) + b
big_angle = 2.0 * np.pi / (len(df) + 1)
small_angle = big_angle / 7
# 整体配置
p = figure(plot_width=width, plot_height=height, title="",
           x_axis_type=None, y_axis_type=None,
           x_range=(-420, 420), y_range=(-420, 420),
           min_border=0, outline_line_color="black",
           background_fill_color="#f0e1d2")
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
# annular wedges
angles = np.pi / 2 - big_angle / 2 - df.index.to_series() * big_angle  #计算角度
colors = [gram_color[gram] for gram in df.gram] # 配置颜色
p.annular_wedge(
    0, 0, inner_radius, outer_radius, -big_angle + angles, angles, color=colors,
)

# small wedges
p.annular_wedge(0, 0, inner_radius, rad(df.penicillin),
                -big_angle + angles + 5 * small_angle, -big_angle + angles + 6 * small_angle,
                color=drug_color['盘尼西林'])
p.annular_wedge(0, 0, inner_radius, rad(df.streptomycin),
                -big_angle + angles + 3 * small_angle, -big_angle + angles + 4 * small_angle,
                color=drug_color['链霉素'])
p.annular_wedge(0, 0, inner_radius, rad(df.neomycin),
                -big_angle + angles + 1 * small_angle, -big_angle + angles + 2 * small_angle,
                color=drug_color['新霉素'])
# 绘制大圆和标签
labels = np.power(10.0, np.arange(-3, 4))
radii = a * np.sqrt(np.log(labels * 1E4)) + b
p.circle(0, 0, radius=radii, fill_color=None, line_color="white")
p.text(0, radii[:-1], [str(r) for r in labels[:-1]],
       text_font_size="8pt", text_align="center", text_baseline="middle")
# 半径
p.annular_wedge(0, 0, inner_radius - 10, outer_radius + 10,
                -big_angle + angles, -big_angle + angles, color="black")
# 细菌标签
xr = radii[0] * np.cos(np.array(-big_angle / 2 + angles))
yr = radii[0] * np.sin(np.array(-big_angle / 2 + angles))
label_angle = np.array(-big_angle / 2 + angles)
label_angle[label_angle < -np.pi / 2] += np.pi  # easier to read labels on the left side
# 绘制各个细菌的名字
p.text(xr, yr, df.bacteria, angle=label_angle,
       text_font_size="9pt", text_align="center", text_baseline="middle")
# 绘制圆形,其中数字分别为 x 轴与 y 轴标签
p.circle([-40, -40], [-370, -390], color=list(gram_color.values()), radius=5)
# 绘制文字
p.text([-30, -30], [-370, -390], text=["Gram-" + gr for gr in gram_color.keys()],
       text_font_size="7pt", text_align="left", text_baseline="middle")
# 绘制矩形,中间标签部分。其中 -40,-40,-40 为三个矩形的 x 轴坐标。18,0,-18 为三个矩形的 y 轴坐标
p.rect([-40, -40, -40], [18, 0, -18], width=30, height=13,
       color=list(drug_color.values()))
# 配置中间标签文字、文字大小、文字对齐方式
p.text([-15, -15, -15], [18, 0, -18], text=list(drug_color),
       text_font_size="9pt", text_align="left", text_baseline="middle")
output_file("burtin.html", title="burtin.py example")
show(p)

元素周期表

元素周期表,这个实现好牛逼啊,距离初三刚开始学化学已经很遥远了,想当年我还是化学课代表呢!由于基本用不到化学了,这里就不实现了。
在这里插入图片描述

今日的分享到这里就结束了,如果对数据可视化有更好的建议,欢迎在评论区留言与我交流,最后祝大家学习进步,大礼包详见个人主页简介获取

Python新手学习交流群:594356095,领取文章源码及大礼包

1 声望
1 粉丝
0 条评论
推荐阅读
python cv2去水印(百度百科)
原理是:用2张图片进行对比需要注意 我这个ddd.jpg是自己非专业P的图,正常应该是都是黑的背景然后logo和原图一样大小,2张图片需要一样的像素长宽

瑞09082阅读 2.1k

MongoDB 插入时间与更新时间(create_time/update_time)
MongoDB 在数据库层面不能像 MySQL 一样设置自动创建 create_time/update_time,自动更新 update_time

qbit阅读 13.9k评论 2

React 之 Context 的变迁与背后实现
本篇我们讲 Context,Context 可以实现跨组件传递数据,大部分的时候并无需要,但有的时候,比如用户设置 了 UI 主题、地区偏好,如果从顶层一层层往下传反而有些麻烦,不如直接借助 Context 实现数据传递。

冴羽1阅读 1.2k

封面图
数据可视化分析之新技能——魔数图
大家在使用数据可视化工具进行数据设计的时候,有没有遇到过这些设计场景:部门人员的履历细信息、工厂各个产线的生产状态和生产信息、公司各个部门的KPI信息……这些数据都有一个共同的特点:数据结构相同,但是内...

葡萄城技术团队1阅读 7.8k

成为一名k8s专家需要掌握哪些知识?当我读完k8s源码之后总结
成为一名k8s专家需要掌握哪些知识在完整的阅读了k8s源码,梳理了160多篇文档之后我进行如下的总结:当然主要目的是罗列一些关键点:具体细节受限篇幅不会贴出来k8s零基础入门运维课程k8s零基础入门运维课程,计算...

ning18751阅读 1.8k评论 1

封面图
交互式仪表板!Python轻松完成!⛵
💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:[链接]📘 本文地址:[链接]📢 声明:版权所有,转载请联系平台与作者并注明出处📢 收藏ShowMeAI查看更多精彩内容💡 引言在本篇内容中,ShowMeAI将给大家讲解使用 📘ipywid...

ShowMeAI阅读 806

Python3 全能安装详解
小编今天折腾了一天,整个Python3 人工智能开发包。卡在pip 包管理器上大半天。找遍大部分资料,就搞不懂为嘛每篇文章就只写一个片面的知识点就不能汇总一下嘛。下面来啦,小编来整理一下,避免下次找不到了。微...

叶剑飞雪阅读 701

Python新手学习交流群:594356095,领取文章源码及大礼包

1 声望
1 粉丝
宣传栏