📜  如何使用Python创建条形图并保存在 pptx 中?

📅  最后修改于: 2022-05-13 01:55:39.125000             🧑  作者: Mango

如何使用Python创建条形图并保存在 pptx 中?

万维网拥有大量可用数据,这些数据的数量和形式都在不断增长。 Python API 允许我们从万维网收集感兴趣的数据/信息。 API 对于数据科学家、Web 开发人员,甚至任何想要以编程方式查找和提取信息的普通人来说都是非常有用的工具。

API 与网页抓取

好吧,大多数网站都提供 API 来以结构化格式共享数据,但是,它们通常会限制可用的数据,并且还可能会限制访问的频率。此外,网站开发人员可能会更改、删除或限制后端 API。

另一方面,有些网站不提供 API 来共享数据。网站开发团队可以随时更改、删除或限制后端 API。简而言之,我们不能依赖 API 来访问我们可能想要的在线数据。因此,我们可能需要依赖网络抓取技术。

Python版

当谈到有效的 API 时, Python通常是首选的编程语言。使用具有非常丰富的工具生态系统来处理许多任务的编程语言很容易。如果你用其他语言编程,你会发现上手Python很容易,而且你可能再也回不去了。

Python软件基金会已宣布Python 2 将在 2020 年逐步停止开发和支持。因此,我们将通过帖子使用Python 3 和 Jupyter notebook。更具体地说,我的Python版本是:

Python3
from platform import python_version
 
 
print(python_version())


Python3
# 1 - imports
import requests
 
# 2 - set the siteurl
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
 
# 3 - set the headers
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# 4 - call the url with headers and save the response
response = requests.get(site_url, headers=headers)
 
# 5 - Get the response
print(f"Response from {site_url} is {response.status_code} ")


Python3
response_json = response.json()
print(f"keys in the Json file : {response_json.keys()}")
print(f"Total javascript repositories in GitHub : {response_json['total_count']}" )


Python3
repositories = response_json['items']
first_repo   = repositories[0]
 
print(f"Output \n  *** Repository information keys total - {len(first_repo)} - values are -\n")
for keys in sorted(first_repo.keys()):
    print(keys)
     
     
print(f" *** Repository name - {first_repo['name']}, Owner - {first_repo['owner']['login']},  total watchers - {first_repo['watchers_count']} ")


Python3
for repo_info in repositories:
    print(f"\n *** Repository Name: {repo_info['name']}")
    print(f" *** Repository Owner: {repo_info['owner']['login']}")
    print(f" *** Repository Description: {repo_info['description']}")


Python3
# imports
import requests
from plotly.graph_objs import Bar
from plotly import offline
 
# siteurl and headers
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# response and parsing the response.
response = requests.get(site_url, headers=headers)
response_json = response.json()
 
repositories = response_json['items']
 
# loop the repositories
repo_names, repo_stars = [], []
for repo_info in repositories:
    repo_names.append(repo_info['name'])
    repo_stars.append(repo_info['stargazers_count'])
 
# graph plotting   
data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
layout = {'title': 'GItHubs Most Popular Javascript Projects',
          'xaxis': {'title': 'Repository'},
          'yaxis': {'title': 'Stars'}}
 
# saving graph to a Most_Popular_JavaScript_Repos.png
fig = {'data': data_plots, 'layout': layout}
offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')


Python3
from pptx import Presentation
 
# create an object ppt
ppt = Presentation()
 
# add a new slide
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# Set the Text to
slide.shapes.title.text = "Popular JavaScript Repositories in GitHub"
 
# save the powerpoint
ppt.save('Javascript_report.pptx')


Python3
from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
# create an Object
ppt = Presentation()
first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# title (included date)
title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
# set the title on first slide
first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
# slide 2 - set the image
img = 'Most_Popular_JavaScript_Repos.png'
second_slide = ppt.slide_layouts[1]
slide2 = ppt.slides.add_slide(second_slide)
 
# play with the image attributes if you are not OK with the height and width
pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
# save the powerpoint presentation
ppt.save('Javascript_report.pptx')


Python3
import requests
from plotly.graph_objs import Bar
from plotly import offline
from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
def github_api():
    # siteurl and headers
    site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
    headers = {'Accept': 'application/vnd.github.v3+json'}
 
    # response and parsing the response.
    response = requests.get(site_url, headers=headers)
    response_json = response.json()
 
    repositories = response_json['items']
 
    # loop the repositories
    repo_names, repo_stars = [], []
    for repo_info in repositories:
        repo_names.append(repo_info['name'])
        repo_stars.append(repo_info['stargazers_count'])
 
    # graph plotting   
    data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
    layout = {'title': 'GItHubs Most Popular Javascript Projects',
              'xaxis': {'title': 'Repository'},
              'yaxis': {'title': 'Stars'}}
 
    # saving graph to a Most_Popular_JavaScript_Repos.png
    fig = {'data': data_plots, 'layout': layout}
    offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')
     
def create_pptx_report():
    # create an Object
    ppt = Presentation()
    first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
    # title (included date)
    title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
    # set the title on first slide
    first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
    # slide 2 - set the image
    img = 'Most_Popular_JavaScript_Repos.png'
    second_slide = ppt.slide_layouts[1]
    slide2 = ppt.slides.add_slide(second_slide)
 
    # play with the image attributes if you are not OK with the height and width
    pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
    # save the powerpoint presentation
    ppt.save('Javascript_report.pptx') 
     
if __name__ == '__main__':
    github_api()
    create_pptx_report()


输出
3.6.10

目标网站的结构

在尝试通过 API 或网络爬虫访问网站内容之前,我们应该始终了解目标网站的结构。除了 Google 搜索和 WHOIS 等外部工具之外,网站的站点地图和 robots.txt 还可以帮助我们获取一些重要信息。

验证 robots.txt 文件

好吧,网站(大多数网站)定义了一个 robots.txt 文件,以在用户访问其网站时注意限制。但是,这些限制只是指导方针,强烈建议尊重他们的指导方针。您应该始终验证并尊重 robots.txt 中的内容,以了解网站的结构并最大程度地减少被阻止的机会。

robots.txt 文件是在决定编写网络爬虫程序或使用 API 之前进行验证的宝贵资源。

了解问题

在这篇文章中,现在收集来自开发者 Facebook 著名的 Github 中星级最高的 JavaScript 存储库,所以让我首先查看他们的 robots.txt 文件。

以下内容(仅前几行)来自网站的robots.txt文件——https://github.com/robots.txt。

从文件中可以清楚地看出,Github 希望通过 API 使用其内容。解决我们问题的一种方法是将我们的搜索条件放在 Github 搜索框中并按 Enter,但是,这是一项手动活动。

有用的是,Github 将这种搜索功能公开为一个 API,我们可以从我们自己的应用程序中使用它。 Github 的 Search API 使我们可以访问内置的搜索函数。这包括使用逻辑和范围运算符,如“或”和“用户”。

在我们进入代码之前,您应该了解一些关于公共存储库、私有存储库和访问限制的信息。公共存储库通常对公众开放,没有任何限制,而私有存储库仅限于所有者和他们选择的合作者。

第 1 步:使用 cURL 进行验证。

现在让我们在努力编写 API 之前快速验证对 Github 的访问。因此,要做到这一点,cURL(一个简单的命令行 HTTP 工具)非常适合。 cURL 通常安装在大多数 Linux 机器上,如果没有,您可以轻松地使用它。 – yum 安装 curl

对于 Windows,请从“https://curl.haxx.se/download.html”获取副本。

现在运行命令,如下所示:

第 2 步:身份验证

通常,在向 Github API 发出请求时,有几种方法可以进行身份验证——使用用户名和密码(HTTP Basic)以及使用 OAuth 令牌。身份验证细节不会在这篇文章中介绍。

由于 Github 允许我们无需任何身份验证即可访问公共内容,因此我们将坚持在没有 API 的情况下搜索公共存储库。这意味着我们将编写一个不需要身份验证的 API,因此我们将只搜索公共存储库。

第 3 步:使用Python的 Github 响应

蟒蛇3

# 1 - imports
import requests
 
# 2 - set the siteurl
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
 
# 3 - set the headers
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# 4 - call the url with headers and save the response
response = requests.get(site_url, headers=headers)
 
# 5 - Get the response
print(f"Response from {site_url} is {response.status_code} ")

输出:

我们首先导入请求(如果缺少使用 pip install requests 的安装),然后使用我们感兴趣的 URL 分配变量 site_url。如果您想搜索按最大星数排序(降序)的 JavaScript 存储库。

Github 目前正在使用其 API 的第三个版本,因此为 API 调用定义了明确要求使用第三个版本 API 的标头。请随时在此处查看最新版本 – https://docs.github.com/en/free-pro-team@latest/developers/overview/about-githubs-apis。

然后调用 get() 并将 site_url 和 header 传递给它,响应对象被分配给响应变量。来自 Github 的响应始终是 JSON。响应对象有一个属性 status_code,它告诉响应是否成功(200)。

第 4 步:将 JSON 响应转换为Python字典

蟒蛇3

response_json = response.json()
print(f"keys in the Json file : {response_json.keys()}")
print(f"Total javascript repositories in GitHub : {response_json['total_count']}" )

输出:

如前所述,响应是 JSON。我们的 JSON 有三个键,对于这么小的 API,我们可以忽略“incomplete_results”。一个程序输出显示了 Github 中为我们的搜索返回的总存储库,使用 response_json['total_count']。

第 5 步:查看我们的第一个存储库

蟒蛇3

repositories = response_json['items']
first_repo   = repositories[0]
 
print(f"Output \n  *** Repository information keys total - {len(first_repo)} - values are -\n")
for keys in sorted(first_repo.keys()):
    print(keys)
     
     
print(f" *** Repository name - {first_repo['name']}, Owner - {first_repo['owner']['login']},  total watchers - {first_repo['watchers_count']} ")

输出:

上面的代码是不言自明的。我们正在做的是显示字典中的所有键,然后在我们的第一个存储库中显示信息。

第 6 步:循环更多……

我们已经查看了一个存储库,更明显的是我们需要遍历循环。

蟒蛇3

for repo_info in repositories:
    print(f"\n *** Repository Name: {repo_info['name']}")
    print(f" *** Repository Owner: {repo_info['owner']['login']}")
    print(f" *** Repository Description: {repo_info['description']}")

输出:

第 7 步:使用 Plotly 进行可视化

是时候使用我们现在拥有的数据进行可视化,以展示 Github 上 JavaScript 项目的流行程度。视觉上消化信息总是有帮助的。

在使用之前你需要安装 Plotly 包。对于安装,在终端中运行此命令。

pip install plotly

代码:

蟒蛇3

# imports
import requests
from plotly.graph_objs import Bar
from plotly import offline
 
# siteurl and headers
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# response and parsing the response.
response = requests.get(site_url, headers=headers)
response_json = response.json()
 
repositories = response_json['items']
 
# loop the repositories
repo_names, repo_stars = [], []
for repo_info in repositories:
    repo_names.append(repo_info['name'])
    repo_stars.append(repo_info['stargazers_count'])
 
# graph plotting   
data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
layout = {'title': 'GItHubs Most Popular Javascript Projects',
          'xaxis': {'title': 'Repository'},
          'yaxis': {'title': 'Stars'}}
 
# saving graph to a Most_Popular_JavaScript_Repos.png
fig = {'data': data_plots, 'layout': layout}
offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')

执行上述代码时,会将条形图保存到当前存储库下的一个 png 文件 - Most_Popular_JavaScript_Repos。

第 8 步:创建演示文稿……简介……

微软产品,尤其是电子表格和 PowerPoint 演示文稿正在统治世界。因此,我们将使用我们刚刚创建的可视化图表创建一个 PowerPoint 演示文稿。

要安装 python-pptx,请在终端中运行此代码:

pip install python-pptx

我们将首先创建标题为“Github 中的流行 JavaScript 存储库”的第一张幻灯片。

蟒蛇3

from pptx import Presentation
 
# create an object ppt
ppt = Presentation()
 
# add a new slide
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# Set the Text to
slide.shapes.title.text = "Popular JavaScript Repositories in GitHub"
 
# save the powerpoint
ppt.save('Javascript_report.pptx')

输出:

我们首先从 ppt 导入 Presentation,然后使用 ppt 模块的 Presentation 类创建一个 ppt 对象。使用 add_slide() 方法添加新幻灯片。使用slide.shapes 添加文本。

第 9 步:将图表保存为 pptx。

现在,上述步骤已涵盖了创建 PowerPoint 的基础知识。现在让我们深入研究创建报告的最后一段代码。

蟒蛇3

from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
# create an Object
ppt = Presentation()
first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# title (included date)
title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
# set the title on first slide
first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
# slide 2 - set the image
img = 'Most_Popular_JavaScript_Repos.png'
second_slide = ppt.slide_layouts[1]
slide2 = ppt.slides.add_slide(second_slide)
 
# play with the image attributes if you are not OK with the height and width
pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
# save the powerpoint presentation
ppt.save('Javascript_report.pptx')

输出:

最后,我们将把上面讨论的所有步骤放在一个程序中。

蟒蛇3

import requests
from plotly.graph_objs import Bar
from plotly import offline
from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
def github_api():
    # siteurl and headers
    site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
    headers = {'Accept': 'application/vnd.github.v3+json'}
 
    # response and parsing the response.
    response = requests.get(site_url, headers=headers)
    response_json = response.json()
 
    repositories = response_json['items']
 
    # loop the repositories
    repo_names, repo_stars = [], []
    for repo_info in repositories:
        repo_names.append(repo_info['name'])
        repo_stars.append(repo_info['stargazers_count'])
 
    # graph plotting   
    data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
    layout = {'title': 'GItHubs Most Popular Javascript Projects',
              'xaxis': {'title': 'Repository'},
              'yaxis': {'title': 'Stars'}}
 
    # saving graph to a Most_Popular_JavaScript_Repos.png
    fig = {'data': data_plots, 'layout': layout}
    offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')
     
def create_pptx_report():
    # create an Object
    ppt = Presentation()
    first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
    # title (included date)
    title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
    # set the title on first slide
    first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
    # slide 2 - set the image
    img = 'Most_Popular_JavaScript_Repos.png'
    second_slide = ppt.slide_layouts[1]
    slide2 = ppt.slides.add_slide(second_slide)
 
    # play with the image attributes if you are not OK with the height and width
    pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
    # save the powerpoint presentation
    ppt.save('Javascript_report.pptx') 
     
if __name__ == '__main__':
    github_api()
    create_pptx_report()