改进pygal图表
根据上篇文章得到的图表来改进样式。我们将进行多个方面的定制,因此先来稍微调整代码的结构,创建一个配置对象,在其中包含要传递给Bar() 的所有定制:
➜ python_repos_pygal.py
--snip--
# 可视化
my_style = LS('#333366', base_style=LCS)
my_config = pygal.Config() #创建pygal类Config的实例
my_config.x_label_rotation = 45 #创建属性x_label_rotation
my_config.show_legend = False #创建属性show_legend
❶my_config.title_font_size = 24
my_config.label_font_size = 14
my_config.major_label_font_size = 18
❷my_config.truncate_label = 15
❸my_config.show_y_guides = False
❹my_config.width = 1000
❺chart = pygal.Bar(my_config, style=my_style)
chart.title = 'Most-Starred Python Projects on GitHub'
chart.x_labels = names
chart.add('', stars)
chart.render_to_file('python_repos.svg')
在❶处,我们设置了图表标题、副标签和主标签的字体大小。在这个 图表中,副标签是 x 轴上的项目名以及 y 轴上的大部分数字。主标签是 y 轴上为5000整数倍的刻度;这些标签应更大,以与副标签区分开来。在❷处,我们使 用truncate_label
将较长的项目名缩短为15个字符(如果你将鼠标指向屏幕上被截短的项目名,将显示完整的项目名)。接下来,我们将show_y_guides
设置为False
,以隐藏图表中的水平线(见❸)。最后,在❹处设置了自定义宽度,让图表更充分地利用浏览器中的可用空间。
在❺处创建Bar 实例时,我们将my_config
作为第一个实参,从而通过一个实参传递了所有的配置设置。我们可以通过my_config
做任意数量的样式和配置修改,而❺处的 代码行将保持不变。下图显示了重新设置样式后的图表。
添加自定义提示工具
在Pygal中,将鼠标指向条形将显示它表示的信息,这通常称为工具提示 。在这个示例中,当前显示的是项目获得了多少个星。下面来创建一个自定义工具提示,以同时显示项目 的描述。
➜ bar_descriptions.py
import 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)
chart.title = 'Python Projects'
chart.x_labels = ['httpie', 'django', 'flask']
plot_dicts = [ #定义列表
❶ {'value': 16101, 'label': 'Description of httpie.'},
{'value': 15028, 'label': 'Description of django.'},
{'value': 14798, 'label': 'Description of flask.'},
]
chart.add('', plot_dicts)
chart.render_to_file('bar_descriptions.svg')
❶处的第一个字典将创建一个条形,用于表示一个获得了16 101 颗星、工具提示为Description of httpie
的项目。
方法add() 接受一个字符串和一个列表。这里调用add() 时,我们传入了一个由表示条形的字典组成的列表(plot_dicts
)。下图显示了一个工具提示:除默认 工具提示(获得的星数)外,Pygal还显示了我们传入的自定义提示。
根据数据绘图
为根据数据绘图,我们将自动生成plot_dicts
,其中包含API调用返回的30个项目的信息。
python_repos.py
# 探索有关仓库的信息
repo_dicts = response_dict['items']
print("Number of items:", len(repo_dicts))
names, plot_dicts = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
if repo_dict['description']: #判断参数是否为none
plot_dict={'value':repo_dict['stargazers_count'],
'label':repo_dict['description'],
'xlink':repo_dict['html_url']
}
plot_dicts.append(plot_dict)
else:
plot_dict={'value':repo_dict['stargazers_count'],
'label':'ABC',
'xlink':repo_dict['html_url']}
plot_dicts.append(plot_dict)
# 可视化
my_style = LS('#333366', base_style=LCS)
--snip--
chart.add('', plot_dicts)
chart.render_to_file('python_repos.svg')