欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

程序员文章站 2022-03-22 20:44:22
...


在学习python之前,许多dalao都推荐 Python编程:从入门到实践这本书,在学习过程中发现,跟着书一边做着有意思的小项目,一边学习基础知识,真的是非常有意思呢(∩_∩),特别是数据可视化这一块,但是技术更新速度快,书中有些工具包内的模块功能已经不能使用,所以作此篇,以记录自己踩过的一些坑和学习python的过程。

安装requests库和pygal库:

用pygal制作Github上星级最高的30个Python项目的直方图图表:
首先输入命令:

pip list

查看是否有pygal和requests第三方库,若没有,则输入下面两个命令安装

pip install requests
pip install pygal

这些操作都是在windows下进行操作,若您的操作系统不是widows,请自行查找安装的方法(∩_∩)。

引用一段书中对Web API的描述:

网站的一部分,用于与使用欸长具体的URL请求特定信息的程序交互。这种请求成为API调用。请求的数据将以易于处理的格式(如JSON或者CSV格式)返回。依赖于外部数据源的大多数程序都依赖于API调用,如集成社交媒体网站的应用程序。

处理API响应:

import requests
import pygal
url = 'https://api.github.com/search/repositories?q=language:python&sort=starts'
r = requests.get(url) # 将响应对象存储在 r 中
response_dicts = r.json() # 使用json()方法将信息转换为一个Python字典
repo_dicts = response_dicts['items'] # items这个键实际上对应的值是一个字典

获取项目的项目名和所获starts数:

repo_dicts = response_dicts['items']
names, starts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    starts.append(repo_dict['stargazers_count'])

使用Pygal可视化仓库:

from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS

my_style = LS('#333366', base_style=LCS)
chart = pygal.Bar(style=my_style, x_label_rotation=45, show_legend=False) #x_label_rotation用于设置x轴标签与x轴之间的夹角
chart.title = 'Most-Starred Python Projects on Github'   #show_legend是图左边的小方框
chart.x_labels = names
chart.add('hahaha', starts)  #add(第一个参数是标签值,把鼠标停在图表上会显示的内容)
chart.render_to_file('python_repos.svg')

程序运行结果:
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

7.2.1 改进Pygal图表不能按照预期进行:

一直到这里,照着书敲代码不会出现任何问题。但是当我运行17.2.1 改进Pygal图表时,也就是为图表创建配置对象的时候,代码就出现了问题。


my_style =  LS('#333366', base_style=LCS)
my_config = pygal.Config() # 创建配置对象

my_config.x_label_rotation = 45
my_config.show_legend = False
my_config.style = LS('#333366', base_style=LCS)

my_config.title_font_size = 20 #主标题
my_config.label_font_size = 10 #副标签:x轴上的项目名以及y轴上的大部分数字
my_config.major_label_font_size = 18 #主标签是y轴上为5000整数倍的刻度

my_config.truncate_label = 10 #将较长的项目名缩短为10个字符(若将鼠标指向被缩短的项目名,将会显示完整的项目名)
my_config.show_y_guides = False #隐藏图表的水平线
my_config.width = 1000 #自定义图标的宽度

chart = pygal.Bar(config=my_config)

我发现不管title_font_size,label_font_size,major_label_font_size这三个值的大小无论设置成多大,图表所对应的内容大小都不会发生变化:

Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

问题原因:

上网寻找帮助时发现:
pygal 在2.0.0发生了变更:Pygal changelog
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

简单来说:这个类中不再有上面的三个属性,而是在 Style 类中,Config中有Style这个类属性可通过my_config.style.font_size的方式来修改font_size属性,更详细的内容请看:Python学习笔记#11 - pygal绘制图表字体大小设置

对书中的代码进行修改后:

my_config.style = LS('#333366', base_style=LCS) # 不要再额外创建一个style实例,否则其里面的font_size属性会覆盖掉下面的my_config.style.font_size属性
# ...略过
my_config.style.title_font_size = 20 
my_config.style.label_font_size = 10 
my_config.style.major_label_font_size = 18
# ...略过
chart = pygal.Bar(config=my_config) # 由于已经设置好了my_config里面的style属性,所有不需要再传入一个style实例作为参数

就可以修改这些参数所对应的内容的大小了。结果如下图所示:
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

17.2.3:根据数据绘图,程序出现错误:

到了 17.2.3:根据数据绘图 ,和以前一样,按照书上的代码敲:

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])

    plot_dict = {
        'value' : repo_dict['stargazers_count'],
        'label' : repo_dict['description'], 
    }
    plot_dicts.append(plot_dict)
# ....略略略
chart.add('', plot_dicts)

然后运行,但是出现了下面的错误:Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)
我们看最后三行的报错:
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

问题原因:

博主用蹩脚的英语能力尝试大概地翻译了一下:”空类型“对象没有属性“decode”,这个空类型应该是label属性,期望应该是个字符串。而且根据我们只添加的两对键-值对来看,value对应的值是个整数,那么出错的地方就应该就是label属性了。

我们用下面的代码进行验证:

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])

    plot_dict = {
        'value' : repo_dict['stargazers_count'],
        'label' : repo_dict['description'], 
    }

    print(type(repo_dict['description']))
	if repo_dict['description']==None:
        print(repo_dict['name'])

输出结果如我们所料:
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)

问题解决:

果然有一个名叫 * 的项目的description为空。解决办法:repo_dict[‘description’]====>str(repo_dict[‘description’]),直接用 str 将 None 强制转换成 “None” 字符串。

最终代码:

import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS

url = 'https://api.github.com/search/repositories?q=language:python&sort=starts'
r = requests.get(url)

response_dicts = r.json()
repo_dicts = response_dicts['items']

print("Numbers of items: ", len(repo_dicts))

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])

    plot_dict = {
        'value' : repo_dict['stargazers_count'],
        'label' : str(repo_dict['description']), 
        'xlink' : repo_dict['html_url'],     
    }


    plot_dicts.append(plot_dict)

my_config = pygal.Config()

my_config.x_label_rotation = 45
my_config.show_legend = False
my_config.style = LS('#333366', base_style=LCS)

my_config.style.title_font_size = 20 
my_config.style.label_font_size = 10 
my_config.style.major_label_font_size = 18 

my_config.truncate_label = 10 
my_config.show_y_guides = False 
my_config.width = 1000 

chart = pygal.Bar(config=my_config)
chart.title = 'Most-Starred Python Projects on Github'
chart.x_labels = names

chart.add('', plot_dicts)
chart.render_to_file('python_repos.svg')

最终结果:
Python学习:数据可视化之使用API (python从入门到实践),问题发现(17.2.1:改进Pygal图表与17.2.3:根据数据绘图)