在IDE中使用altair无法显示绘图结果

news2024/10/7 12:28:58

同学们以及熟悉Pycharm编辑运行python代码。正如文章末尾给出的pycharm运行altair的建议方法视觉效果一般。

因为数据可视化在IDE实现效果不理想,这是因为altair使用Vega和Vega-Lite语法来创建交互式图表,而IDE无法直接渲染这些图表。

习惯了pycharm的同学是时候考虑安装和熟悉 anancoda

anancoda可以在Jupyter Notebook中使用altair。Jupyter无需任何设置就可以直接显示Vega和Vega-Lite图表。

以下的代码都是运行在Jupyter Notebook

import pandas as pd
import altair as alt

source = pd.DataFrame({"values": [12, 23, 47, 6, 52, 19]})

base = alt.Chart(source).encode(
    theta=alt.Theta("values:Q", stack=True),
    radius=alt.Radius("values", scale=alt.Scale(type="sqrt", zero=True, rangeMin=20)),
    color="values:N",
)

c1 = base.mark_arc(innerRadius=20, stroke="#fff")

c2 = base.mark_text(radiusOffset=10).encode(text="values:Q")

c1 + c2

通过以下饼图的效果,与更早的matplotlib实现的效果和代码量比较,是不是降低了可视化的实用难度?

alt

你会被吸引altair只需寥寥几行代码就能实现的视觉效果。进一步在官网中你会了解以下案例。

初学者建议altair入手。当然甘蔗没有两头甜,matplotlib用于高度定制化的场景上,难度较高也是必然的。

一、熟悉下数据集模块 vega_datasets

vega_datasets是一个数据集模块,包含多种可视化相关的数据集,用于测试和示例。

要使用vega_datasets,需先安装:

pip install vega_datasets

然后在Python代码中导入:

from vega_datasets import data

这会导入data对象,包含所有数据集。

您可以通过data对象访问每个数据集:

airports = data.us_airports.url  # US airports dataset
stocks = data.stocks.url         # Stock market dataset
cars = data.cars.url            # Motor vehicle dataset 
etc...

每个数据集都有url和value两个属性:

- url: 数据集文件的URL
- value: 数据集本身,以pandas DataFrame形式

所以如果您希望在Notebook中直接使用数据集,可以使用value。

如果希望将其用于服务器端应用,应使用url来加载数据集。

例如,要在Jupyter Notebook中使用us_airports数据集:

import pandas as pd

airports = data.us_airports.value
airports.head()  # View first 5 rows
要在服务器端应用中使用,可以:
python
import pandas as pd

url = data.us_airports.url
airports = pd.read_csv(url)

vega_datasets为学习和测试数据可视化提供了非常便利的数据集资源。利用它可以快速创建示例和案例,加速学习过程。

爱荷华州的可再生能源热潮

此示例是使用爱荷华州电力来源的示例数据集的完全开发的堆叠图。

import altair as alt
from vega_datasets import data

source = data.iowa_electricity()

alt.Chart(
    source,
    title=alt.Title(
        "Iowa's green energy boom",
        subtitle="A growing share of the state's energy has come from renewable sources"
    )
).mark_area().encode(
    alt.X("year:T").title("Year"),
    alt.Y("net_generation:Q")
        .title("Share of net generation")
        .stack("normalize")
        .axis(format=".0%"),
    alt.Color("source:N").title("Electricity source")
)

机场的连接相通网络

大喵第一次看到视觉效果还是有的震撼的!

alt

这个交互式图表利用鼠标悬停选中机场,高亮显示其连接航线,使观众可以更深入理解美国主要机场之间的交通联系。

代码如下:

import altair as alt
from vega_datasets import data

# Since these data are each more than 5,000 rows we'll import from the URLs
airports = data.airports.url
flights_airport = data.flights_airport.url

states = alt.topo_feature(data.us_10m.url, feature="states")

# Create mouseover selection
select_city = alt.selection_point(
    on="mouseover", nearest=True, fields=["origin"], empty=False
)

# Define which attributes to lookup from airports.csv
lookup_data = alt.LookupData(
    airports, key="iata", fields=["state""latitude""longitude"]
)

background = alt.Chart(states).mark_geoshape(
    fill="lightgray",
    stroke="white"
).properties(
    width=750,
    height=500
).project("albersUsa")

connections = alt.Chart(flights_airport).mark_rule(opacity=0.35).encode(
    latitude="latitude:Q",
    longitude="longitude:Q",
    latitude2="lat2:Q",
    longitude2="lon2:Q"
).transform_lookup(
    lookup="origin",
    from_=lookup_data
).transform_lookup(
    lookup="destination",
    from_=lookup_data,
    as_=["state""lat2""lon2"]
).transform_filter(
    select_city
)

points = alt.Chart(flights_airport).mark_circle().encode(
    latitude="latitude:Q",
    longitude="longitude:Q",
    size=alt.Size("routes:Q", scale=alt.Scale(range=[0, 1000]), legend=None),
    order=alt.Order("routes:Q", sort="descending"),
    tooltip=["origin:N""routes:Q"]
).transform_aggregate(
    routes="count()",
    groupby=["origin"]
).transform_lookup(
    lookup="origin",
    from_=lookup_data
).transform_filter(
    (alt.datum.state != "PR") & (alt.datum.state != "VI")
).add_params(
    select_city
)

(background + connections + points).configure_view(stroke=None)

美国机场互联交互式图表例子显示了美国主要机场之间的所有连接。

查找转换用于找到每个机场和连接机场的坐标。

鼠标悬停在连接上会通过单选显示连接。

这个交互式图利用Selection来实现鼠标悬停在机场上高亮显示该机场的连接航线。

大衰退期间的美国就业崩溃

此示例是一个完全开发的条形图,使用大衰退期间美国就业变化的示例数据集进行负值。

import altair as alt
import pandas as pd
from vega_datasets import data

source = data.us_employment()
presidents = pd.DataFrame([
    {
        "start""2006-01-01",
        "end""2009-01-19",
        "president""Bush"
    },
    {
        "start""2009-01-20",
        "end""2015-12-31",
        "president""Obama"
    }
])

bars = alt.Chart(
    source,
    title="The U.S. employment crash during the Great Recession"
).mark_bar().encode(
    alt.X("month:T").title(""),
    alt.Y("nonfarm_change:Q").title("Change in non-farm employment (in thousands)"),
    color=alt.condition(
        alt.datum.nonfarm_change > 0,
        alt.value("steelblue"),
        alt.value("orange")
    )
)

rule = alt.Chart(presidents).mark_rule(
    color="black",
    strokeWidth=2
).encode(
    x='end:T'
).transform_filter(alt.datum.president == "Bush")

text = alt.Chart(presidents).mark_text(
    align='left',
    baseline='middle',
    dx=7,
    dy=-135,
    size=11
).encode(
    x='start:T',
    text='president',
    color=alt.value('#000000')
)

(bars + rule + text).properties(width=600)

此示例是一个完全开发的条形图:

alt

美国人口金字塔随时间的变化

人口金字塔显示人口中年龄组的分布。 它使用绑定到年份的滑块小部件来可视化年龄 随时间推移的分布。

import altair as alt
from vega_datasets import data

source = data.population.url

slider = alt.binding_range(min=1850, max=2000, step=10)
select_year = alt.selection_point(name='year', fields=['year'],
                                   bind=slider, value={'year': 2000})

base = alt.Chart(source).add_params(
    select_year
).transform_filter(
    select_year
).transform_calculate(
    gender=alt.expr.if_(alt.datum.sex == 1, 'Male''Female')
).properties(
    width=250
)


color_scale = alt.Scale(domain=['Male''Female'],
                        range=['#1f77b4''#e377c2'])

left = base.transform_filter(
    alt.datum.gender == 'Female'
).encode(
    alt.Y('age:O').axis(None),
    alt.X('sum(people):Q')
        .title('population')
        .sort('descending'),
    alt.Color('gender:N')
        .scale(color_scale)
        .legend(None)
).mark_bar().properties(title='Female')

middle = base.encode(
    alt.Y('age:O').axis(None),
    alt.Text('age:Q'),
).mark_text().properties(width=20)

right = base.transform_filter(
    alt.datum.gender == 'Male'
).encode(
    alt.Y('age:O').axis(None),
    alt.X('sum(people):Q').title('population'),
    alt.Color('gender:N').scale(color_scale).legend(None)
).mark_bar().properties(title='Male')

alt.concat(left, middle, right, spacing=5)

新闻报道里经常采纳的对比效果图。

alt

伦敦地铁线路

此示例显示了伦敦地铁线路在自治市镇边界。它基于 https://vega.github.io/vega-lite/examples/geo_layer_line_london.html 的 vega-lite 示例。

import altair as alt
from vega_datasets import data

boroughs = alt.topo_feature(data.londonBoroughs.url, 'boroughs')
tubelines = alt.topo_feature(data.londonTubeLines.url, 'line')
centroids = data.londonCentroids.url

background = alt.Chart(boroughs, width=700, height=500).mark_geoshape(
    stroke='white',
    strokeWidth=2
).encode(
    color=alt.value('#eee'),
)

labels = alt.Chart(centroids).mark_text().encode(
    longitude='cx:Q',
    latitude='cy:Q',
    text='bLabel:N',
    size=alt.value(8),
    opacity=alt.value(0.6)
).transform_calculate(
    "bLabel""indexof (datum.name,' ') > 0  ? substring(datum.name,0,indexof(datum.name, ' ')) : datum.name"
)

line_scale = alt.Scale(domain=["Bakerloo""Central""Circle""District""DLR",
                               "Hammersmith & City""Jubilee""Metropolitan""Northern",
                               "Piccadilly""Victoria""Waterloo & City"],
                       range=["rgb(137,78,36)""rgb(220,36,30)""rgb(255,206,0)",
                              "rgb(1,114,41)""rgb(0,175,173)""rgb(215,153,175)",
                              "rgb(106,114,120)""rgb(114,17,84)""rgb(0,0,0)",
                              "rgb(0,24,168)""rgb(0,160,226)""rgb(106,187,170)"])

lines = alt.Chart(tubelines).mark_geoshape(
    filled=False,
    strokeWidth=2
).encode(
    alt.Color('id:N')
        .title(None)
        .legend(orient='bottom-right', offset=0)
        .scale(line_scale)
)

background + labels + lines

伦敦地铁线路

alt

正如文章末尾给出的pycharm运行altair的建议方法视觉效果一般。

数据可视化在IDE实现效果不理想,习惯了pycharm的同学是时候考虑安装和熟悉 anancoda

Altair有丰富案例展示,请访问:

https://altair-viz.github.io/gallery/index.html#uncertainties-and-trends

alt

在Pycharm IDE中使用altair无法显示绘图结果。

这是因为altair使用Vega和Vega-Lite语法来创建交互式图表,而IDE无法直接渲染这些图表。

alt

附录:在IDE中显示altair图表有两种方法:

  1. 使用altair的show()方法。在最后一行代码后添加:
c1 + c2.show() 

这会在一个新的浏览器标签页中显示交互式图表。

  1. 使用altair的save()方法将图表保存为HTML文件,然后在IDE中打开此HTML文件以显示图表。具体代码如下:
c1 + c2.save('chart.html')

然后就可以在IDE中打开chart.html文件查看图表了。

所以,要在IDE中显示您的altair代码结果,可以:

  1. 使用show()方法在浏览器中查看
  2. 使用save()方法保存为HTML文件,在IDE中打开查看
  3. 在Jupyter Notebook中运行代码以显示图表

altair和matliblotlib是两种流行的Python数据可视化库,但它们之间有以下主要区别:

  1. 交互性:altair基于Vega和Vega-Lite,可以创建高度交互式图表,而matplotlib的交互性较弱。

  2. 语法:altair的语法更高级,基于Vega的语法,而matplotlib的语法更低级,需要手动指定各种图形元素。

  3. 复杂度:altair更适合快速简单可视化,matplotlib可实现更加复杂定制化的图表。

  4. 性能:altair的图表性能更高,因为其基于Vega的编译器,而matplotlib是Python代码直接渲染,性能相对较差。

  5. 定制化:matplotlib的定制化空间更大,可以自由控制图表的各个方面,而altair的定制化较为有限。

总体来说:

  • 如果您需要快速创建交互式图表,altair是一个很好的选择。
  • 如果您需要高度定制的静态图表,以及较强的可定制性,matplotlib会更合适。
  • 如果既需要交互性又需要定制性,可以选用altair构建交互结构,再使用matplotlib进一步美化和定制静态图表。

两种库各有优点,可以根据具体需求和场景选择更加合适的工具。

我的建议是:

  1. 入门学习可视化,选择altair,简单高效。
  2. 需要高度定制复杂图表,选择matplotlib。
  3. 将两者结合使用,发挥各自优势。

希望这个解释和解决方案能够帮助您在IDE中显示altair图表结果。如果您有任何其他问题,欢迎与我交流。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发手册中为什么禁止使用BigDecimal的equals方法做等值比较以及为什么禁止使用double直接构造BigDecimal

场景 阿里Java开发手册嵩山版中明确指出: 1、BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法 equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度 2、禁止使用构造方法BigDeci…

深度学习简介

什么是深度学习? 一、深度学习–神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierachical Learning】或者 深度机器学习【Deep Machine Learning】)是一类算法…

CSDN送了我一本书:《写作脑科学》| 记我与写博客

文章目录 收到之前收到之后番外——我与写博客从日记开始写博客至今 收到之前 CSDN有个深读计划的活动,在报名者中抽取一些小伙伴免费送书,但是收到书籍后需要写一篇书评,否则不能继续参加下次的活动。要求写书评可能是出版社或作者希望可以…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

ISO21434 网络安全验证(八)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 五、输出 一、概述 本条款描述了该项目的车辆级别的网络安全验证活动。该项目被考虑在车辆层面的操作环境以及系列生产的配置。 二、目标 本条款的目的是: 验证网络安全目…

软考A计划-系统架构师-官方考试指定教程-(4/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

建议收藏:超详细ChatGPT(GPT 4.0)论文润色指南+最全提示词/咒语

在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 本篇文章持续更新,祝大家写作顺利,如果对你有帮助,记得三连! 欢迎大家在评论区补充…

switch语句详细逆向分析

首先需要明确一点switch语句在游戏当中至关重要,而且基本都会使用它来提高效率! 因为我们在找call的时候,如果能够识别出来switch语句,只要找到一个call,后面的就都搞定了 switch:case必须是整数&#xf…

C#,码海拾贝(37)——求解“托伯利兹方程组“的“列文逊方法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

【高危】Linux kernel Netfilter UAF漏洞(POC公开)

漏洞描述 Netfilter 是 Linux kernel 的一个子系统&#xff0c;用于提供网络数据包过滤和网络地址转换功能。 Linux kernel 6.3.1及之前版本中&#xff0c;当 Netfilter 处理批量请求以更新 nf_tables 配置时&#xff0c;由于对匿名集合的操作处理不当会导致use-after-free&a…

【Java】Java核心要点总结:61

文章目录 1. java中的线程池是如何实现的2. 创建线程池的几个核心参数3. Java 中线程池的执行流程4. 为什么要使用线程池5. 线程池的拒绝策略 1. java中的线程池是如何实现的 Java 中的线程池是通过 ThreadPoolExecutor 类实现的。ThreadPoolExecutor 继承自 AbstractExecutorS…

chatgpt赋能python:如何快速复制Python库到其他电脑

如何快速复制Python库到其他电脑 作为一名拥有10年Python编程经验的工程师&#xff0c;我深知Python库在项目开发中扮演着非常重要的角色。Python库能够帮助我们快速实现功能、减少重复工作以及提高代码质量。但是&#xff0c;在换电脑或在新的团队合作时&#xff0c;我们常常…

【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

最近比较忙&#xff0c;这道题用了好长时间来debug&#xff0c;甚至贡献了第一次在csdn上提问。。。 目录 前言 一、题目重述&思路分析 二、exp 三、Canary 四、萌新遇到的困难 总结 前言 Canary作为经典且基本的栈保护措施&#xff0c;在后期的题目中必然是基本标…

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…

Servlet 详解

目录 什么是 servlet? Servlet 是做甚的? 如何编写一个 Servlet 程序? 解析访问出错情况 Servlet 的运行原理 1. 接收请求 2. 根据请求计算响应 3. 返回响应 Servlet API 详解 HTTPServlet HttpServletRequset HttpServletResponse 什么是 servlet? Servlet 是…

String模拟实现(二)

resize resize的特点是扩容加初始化&#xff0c;如果所给的长度小于空间大小就会删除多余的数据。前面我们实现了reserve&#xff0c;但有这样一个问题&#xff0c;如果reserve的长度小于空间就会导致缩容&#xff0c;而我们知道&#xff0c;string中缩容用的是shrink_to_fit&a…

外观设计模式解读

目录 问题引进 传统方式解决影院管理 外观模式基本介绍 概念 外观模式原理类图 分类外观模式的角色 外观模式解决影院管理 传统方式解决影院管理说明 外观模式应用实例 外观模式的注意事项和细节 s统的内部细节 > 外观模式 外观模式基本介绍 概念 1) 外观模式&…

XGBoost的介绍

一、XGBoost的介绍 1.什么是XGBoost&#xff1f; XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种基于梯度提升树的机器学习算法&#xff0c;它在解决分类和回归问题上表现出色。它是由陈天奇在2014年开发的&#xff0c;如今已成为机器学习领域中最流行和强…

集合框架知识汇总

集合框架 集合 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法。可以实现数组功能 和数组的区别 数组长度固定&#xff0c;集合长度不固定 数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型 总结 List集合 有序&#xff0c;有…

软考网工易混淆知识点总结(持续更新中,按照知识点先后排序)

1.数据编码--原码、反码和补码 原码 数值前面增加了一位符号位(即最高位为符号位)&#xff0c;该位为0时表示正数&#xff0c;为1时则表示负数&#xff0c;其余各位表示数值的大小反码 正数的反码与原码相同&#xff0c;负数的反码符号位为1&#xff0c;其余各位为该数绝对值的…