可视化精选库 Altair

Altair 上手基础

Altair是一个用于Python的统计数据可视化库。它提供了一个简单易懂的语法来创建静态和互动的可视化。

我最喜欢的是Altair的数据转换和过滤功能。它提供了灵活多变的方法来转换和过滤数据,同时创建一个数据可视化。

在这个意义上,Altair也可以被视为一个数据分析工具。我们将通过3个例子来展示Altair如何加速探索性数据分析过程。

我们将使用Kaggle网站上的墨尔本住房数据集的一个小样本作为例子。我们首先导入库并读取数据集。
[Melbourne Housing Snapshot | Kaggle]
(https://www.kaggle.com/datasets/dansbecker/melbourne-housing-snapshot/code)

import numpy as np
import pandas as pd
import altair as alt
cols = ['Type', 'Price', 'Distance', 'Date', 'Landsize', 'Regionname']
melb = pd.read_csv(
   "D:/data_science/dataset/melb_data.csv", usecols = cols, parse_dates = ['Date']
).sample(n=1000).reset_index(drop=True)
melb.head()

XqPJ89JDbp.png

例一:我们将创建一个条形图,显示每个地区的平均房价。一种选择是通过使用Pandas的函数来计算平均值,然后绘制结果。然而,我们可以用Altair一次完成。

alt.Chart(melb).mark_bar().encode(
   x = 'Regionname', y = 'avg_price:Q'
).transform_aggregate(
   avg_price = 'mean(Price)', groupby = ['Regionname']
).properties(
   height = 300, width = 500
)

输出图表


wMIh62zEFF.png

语法以一个顶级的Chart对象开始,后面是绘图类型。encode函数用于指定在传递给Chart对象的数据框架中绘制什么。

你可能已经注意到了,y编码不是数据框架中的一个列。它是聚合列,在下一步使用transform_aggregate 函数进行计算。
y 编码中的 "Q "字母代表数量。
属性函数用于调整可视化的属性。
下面是上面的代码所产生的图。

image.png

(图片由作者提供)

例二:距离栏表示房子到中心商业区的距离。假设我们想为距离超过3英里的房子创建前面例子中的情节。我们可以通过在代码中实现transform_filter函数来轻松完成这一任务。

alt.Chart(
  melb, height=300, width=500
).mark_bar().encode(
  x = 'Regionname', y = 'avg_price:Q'
).transform_filter(
  alt.FieldGTPredicate(field='Distance', gt=3)
).transform_aggregate(
  avg_price = 'mean(Price)',groupby = ['Regionname']
)

FieldGTPredicate处理 "大于 "条件。Altair还提供了其他条件的谓词,如 "等于"、"小于"、"范围 "等等。
在前面的例子中,我们使用属性函数来调整大小。在这个例子中,同样的操作是在图表对象内部完成的。
下面是过滤后的数值的柱状图。

image.png

(图片由作者提供)

例三
这个例子涉及到一个查找操作,类似于Pandas的合并函数。
考虑到我们有另一个数据框架,包含了这些房子的主人的一些信息。

melb['OwnerId'] = np.arange(1,1001)
df = pd.DataFrame({
  'OwnerId': melb['OwnerId'],
  'Age': np.random.randint(20, 40, size=1000),
  'Salary': np.random.randint(5000, 10000, size=1000)
})
df.head()
CIet5TUIuY.png
image.png

我们在原来的数据框架中增加了一个id列,并创建了一个新的数据框架,其中包含客户的id、年龄和工资信息。

我们想绘制出每种房屋类型的业主的平均工资。我们可以用Pandas函数来合并数据框,按房屋类型对数据点(即行)进行分组,并计算出平均值。
另一个选择是使用Altair的查找转换,如下所示。

alt.Chart(
  df, height=300, width=500
).mark_bar().encode(
  x = 'mean(Salary):Q', y = 'Type:O'
).transform_lookup(
  lookup='OwnerId',
  from_=alt.LookupData(data=melb, key='OwnerId', fields=['Type'])
)

lookup参数指的是用于合并的列。下面是生成的图。


image.png

(图片由作者提供)
总结
我们已经做了3个例子,展示了Altair的转换和过滤能力。关于这些操作,Altair也是一个数据分析和操作的工具。
当然,Pandas在此类操作上要强大得多。然而,在创建可视化的同时,能够进行基本的数据处理操作,为Altair增加了重要价值。
我们只做了柱状图的例子,但转换功能可以适当地扩展到任何其他图。

Altair: 用于Python的统计可视化库

实用的入门指南

Soner Yıldırım -5 分钟阅读

https://unsplash.com/
照片:Isaac Smith on Unsplash
Altair是一个Python的统计可视化库。它的语法简洁易懂,正如我们将在例子中看到的那样。用Altair创建交互式可视化也非常简单。

Altair在数据转换方面非常灵活。在创建可视化时,我们可以应用许多不同类型的转换。这使得该库在探索性数据分析方面更加有效。

我认为Altair的特别之处在于比其他一些流行的Python数据可视化库(如Matplotlib和Seaborn)更重的统计方面。

在这篇文章中,我们将创建一些基本的图来熟悉Altair的语法和结构。我们还将看到在创建图的过程中是如何实现数据转换的。

我们首先要导入Altair。如果你使用的是Google Colab,它已经被安装,可以直接导入。如果没有,你可以使用pip轻松地安装它。

我们将使用一个保险数据集,你可以从Kaggle获得。我们将把数据集读入一个Pandas数据框。
下载地址 Medical Cost Personal Datasets | Kaggle

import Altair as ALTAL
import numpy as np
import pandas as pdinsurance = pd.read_csv("/content/insurance.csv")
insurance.head()

XqPJ89JDbp.png

(图片由大喵提供)
这个数据集包含了一些关于某保险公司的客户和保险收费金额的衡量标准(即特征)。

散点图
散点图主要用于可视化两个数字变量之间的关系。

(alt.
  Chart(insurance).
  mark_circle(size=40).
  encode(x='charge', y='bmi').
  properties(height=400, width=500))

我把每个步骤放在一个单独的行中,以强调类似链式的操作。我们首先将数据传递给一个顶层的图表对象。数据可以是Pandas数据框的形式,也可以是指向json或csv文件的URL字符串。

第二行描述了可视化的类型(例如:mark_circle,mark_line,等等)。编码函数指定在给定的数据框架中绘制什么。因此,我们在编码函数中写的任何东西都必须与数据框架相连。最后,我们使用properties函数来指定绘图的某些属性。
下面是用上述代码创建的图。

chrome_zY7K87s7O6.png

(图片由大喵提供)
我们可以使绘图的内容更加丰富。例如,我们可以在编码函数中使用颜色参数,根据一个分类变量来分离数据点。它类似于Seaborn的色调参数。
我们还可以通过在结尾处添加交互式函数来使图表具有交互性。

(alt.
  Chart(insurance).
  mark_circle(size=50).
  encode(x='charges', y='bmi', color='smoker').
  properties(height=400, width=500).
  interactive())
altaircode3.png
altaircode4.gif

(丁大喵提供的图片和GIF)

可以为这个图添加更多的功能。我们可以使用工具提示参数,当我们在点上悬停时显示额外的变量。这就像Seaborn的hover参数一样。

(alt.
  Chart(insurance).
  mark_circle(size=50).
  encode(x='charges', y='bmi', color='smoker', tooltip=   
  ['age','sex']).
  properties(height=400, width=500).
  interactive())

altaircode5.png

(丁大喵提供的图片)

条形图
在创建可视化的过程中,Altair使得实现数据转换变得简单而高效。例如,我们可以创建一个条形图,显示区域列中每个类别的平均收费。

(alt.
  Chart(insurance).
  mark_bar()
  encode(x='region', y='mean(charges):Q')
  properties(height=300, width=400))

(图片由作者提供)
我们将转换指定为一个字符串('mean(charges):Q'),这相当于以下语法:

y=alt.X(field='charge', aggregate='mean', type='quantitative')
insurance[['region','charges']].groupby('region').mean()

让我们用Pandas的groupby函数来计算同样的平均数以确认结果。
insurance[['地区','收费']].groupby('地区').mean()

altaircode6.png

结果与预期相同。我们在可视化中实现了这个计算。

直方图
直方图主要用于可视化连续变量的分布。它将连续变量的数值范围划分为离散的仓,并显示每个仓中存在多少个数值。
下面的代码将创建一个bmi变量的直方图。

(alt.
  Chart(insurance).
  mark_bar().
  encode(x ='bmi:Q', y='count()').
  properties(height=300, width=500))

altaircode7.png

(图片由丁大猫提供)

我们使用make_bar函数与数据转换步骤来创建一个直方图。在encode函数中,我们将bmi变量的值范围划分为离散的bin,并计算每个bin中的数据点数量。

图的网格
在同一个可视化中创建多个图是非常简单的。
我们首先需要将这些图分配给变量,然后用这些变量来组合图或创建一个图的网格。

p1 = (alt.
        Chart(insurance).
        mark_bar().
        encode(x='region', y='mean(charges):Q').
        properties(height=200, width=300))

p2 = (alt.
        Chart(insurance).
        mark_bar().
        encode(alt.X('bmi:Q', bin=True), y='count()').
        properties(height=200, width=300))

图 p1:


altaircode8.png

图 p2:

altaircode9.png

一旦我们有了这些变量,我们就可以使用逻辑运算符来组合它们。

p1 | p2
altaircode10.png

(图片由大喵提供)

p1 & p2
altaircode11.png

(图片由大喵提供)

正如你所看到的,这就像数学运算一样,可以将图画组合起来。
p1 + p2 语法将合并同一图中的图,但它在我们的例子中并不合适。
如果我们有一个直线图和一个柱状图,这将是一个可以考虑的选项。
我们可以通过这种方式组合几个图来创建一个网格图。
例如,(p1 & p2) | (p3 & p4) 创建一个由4个图组成的网格(2行和2列)。

总结
这篇文章可以看作是对Altair的一个介绍。这个库提供的功能还有很多。
我最喜欢Altair的地方是数据转换的便捷性和简单性。
它也促进了数据分析过程。
在Altair系列的第二部分,我重点介绍了过滤和数据转换在可视化中的应用。
我将会写更多关于Altair的教程。敬请关注这个库的更多高级功能。
谢谢您的阅读。如果您有任何反馈,请告诉我。

PYTHON. 数据科学的地理可视化

交互式地理可视化之战第七部分--Bokeh
使用Bokeh库创建美丽的交互式地理图表

照片:delfi de la Rua on Unsplash

前事不忘后事之师
在这个系列中,我们已经尝试6种制作美丽的地理散点图的方法。

Holoviews - 交互式地理可视化之战 第一部分 - 使用一行代码的交互式地图
Plotly Express - 交互式地理可视化之战 第2部分 - 使用一行代码的交互式地图
Plotly Go - 交互式地理可视化之战 第3部分 Plotly图形对象(Go)
Altair - 交互式地理可视化之战 第四部分 - Altair
Folium - 交互式地理可视化之战 第五部分 - Folium
Greppo - 交互式地理可视化之战 第六部分 - Greppo

在这篇文章中,我们将学习如何用Bokeh做到这一点。现在,Bokeh内部建立在Panel上,这就是我们在该系列的第一篇文章中使用的东西。

PLOTLY VS. BOKEH

一篇关于这个问题的文章总结了这两个库的主要区别。当我们谈论易用性时,Plotly更好,推而广之,在做单个(包括3D)地图时更容易使用。
Bokeh的亮点在于它的仪表盘能力。这意味着它更容易创建、主持和风格化仪表盘。
不多说了,让我们开始编码。
编码
前言
我们将使用以下包来重新创建我们与其他文章的互动地图。

import pandas as pd
#Transformation of Geocodes
from pyproj import Proj, transform
from bokeh.plotting import figure, save, show
from bokeh.io import output_notebook
#For the Map Tiles
from bokeh.tile_providers import get_provider, WIKIMEDIA, CARTODBPOSITRON, STAMEN_TERRAIN, STAMEN_TONER, ESRI_IMAGERY, OSM
tile_provider = get_provider(xyz.OpenStreetMap.Mapnik)
#To display properly the maps
import panel as pn
pn.extension()
import warnings
warnings.filterwarnings("ignore")

篇幅所限,请关注后续更新

Plotly

import plotly.express as px

df = px.data.gapminder().query("continent == 'Europe' and year == 2007 and pop > 2.e6")
fig = px.bar(df, y='pop', x='country', text='pop')
fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
fig.update_layout(uniformtext_minsize=8, uniformtext_mode='hide')
fig.show()
image.png
image.png

富文本 rich 方便的打印输出 代码

from rich.console import Console
from rich.syntax import Syntax

my_code = '''

def gcd(a, b):
    """Computes the greatest common divisor of integers a and b using
    Euclid's Algorithm.
    """
    while b != 0:
        a, b = b, a % b
    return a


def lcm(a, b):
    """Computes the lowest common multiple of integers a and b."""
    return a * b / gcd(a, b)

'''

syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
console = Console()
console.print(syntax)
image.png
import altair as alt
from vega_datasets import data

source = data.cars()

alt.Chart(source).mark_circle(size=60).encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
    tooltip=['Name', 'Origin', 'Horsepower', 'Miles_per_Gallon']
).interactive()
chrome_pi0crQnwgU.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容