Python 萬能代碼模版:數據可視化篇
“閱讀本文大概需要6分鐘”
上一篇,我寫了:Python 萬能代碼模版:爬蟲代碼篇 接下來,是第二個萬能代碼,數據可視化篇。
其實,除了使用 Python 編寫爬蟲來下載資料, Python 在數據分析和可視化方面也非常強大。往往我們在工作中需要經常使用 Excel 來從表格生成曲線圖,但步驟往往比較繁瑣,而用 Python 則可以輕松實現。
1. 從 csv 或 excel 提取數據來畫圖
本節(jié)需要先安裝 pandas 、matplotlib、seaborn
pip install pandas matplotlib seaborn
我們以剛才創(chuàng)建的 tips_2.xlsx 這個 excel 為例,來介紹我們如何把 Excel 表格中的數據畫成圖。
tips_2.xlsx 是上一篇我們生成的:Python 萬能代碼模版:爬蟲代碼篇
我們這次將 excel 中的賣出價一列,生成柱狀圖。
代碼如下所示:
# -*- coding: utf-8 -*-
# @Author: AI悅創(chuàng)
# @Date: 2021-09-14 21:56:37
# @Last Modified by: aiyc
# @Last Modified time: 2021-09-15 14:27:22
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 使用 pandas 讀取 excel, csv 文件的話換成 pd.read_csv 即可
df = pd.read_excel("tips2.xlsx")
# 因為第一行是中文表頭,所以我們先過濾掉
df = df[df.index>0]
sns.set()
figure2 = plt.figure(figsize = (10, 5))
figure2.add_subplot(1,1,1)
# 設置軸的屬性
plt.xlabel("",fontsize = 14)
plt.ylabel("賣出價", fontsize = 14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title("外匯情況", fontsize=14)
# 設置字體的屬性
# plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]
# plt.rcParams["font.family"] = 'sans-serif'
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
category = df[0]
index_category = np.arange(len(category))
# 將賣出價 轉換為數字
df[3] = pd.to_numeric(df[3])
plt.xticks(rotation = 90)
plt.bar(x=df[0], height=df[3].values, color=[1,0,1])
plt.show()
輸出如下所示:

替換說明:

替換要畫圖的 excel 文件夾名稱
Y 軸的標題
圖的標題
橫軸的數據(第幾列做橫軸)
縱軸的數據(第幾列做縱軸)
代碼: https://github.com/AndersonHJB/AIYC_DATA/tree/main/02-玩轉圖表,實現數據可視化/2.1%20從%20csv%20或%20excel%20提取數據來畫圖
2. 從文本文件中生成詞云
需要先安裝 wordcloud,jieba
pip install wordcloud jieba
詞云是最近數據分析報告中非常常見的數據表現形式了,它會從一段文字中抽取出高頻的詞匯并且以圖片的形式將它們展示出來。
如何用 Python 生成詞云呢?
為了做示范,我們首先解析第一步我們抓取的 tips_1.html 網頁(考研網),將所有的新聞標題都存儲到一個文本文檔中。
代碼如下:
# -*- coding: utf-8 -*-
# @Author: AI悅創(chuàng)
# @Date: 2021-09-15 22:15:30
# @Last Modified by: aiyc
# @Last Modified time: 2021-09-15 23:12:34
from bs4 import BeautifulSoup
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
def create_doc_from_filename(filename):
with open(filename, "r", encoding='utf-8')as f:
html_content = f.read()
doc = BeautifulSoup(html_content, "lxml")
return doc
def parse(doc):
post_list = doc.find_all("div",class_="post-info")
result = []
for post in post_list:
link = post.find_all("a")[1]
result.append(link.text.strip())
result_str="\n".join(result)
with open("news_title.txt", "w", encoding='utf-8') as fo:
fo.write(result_str)
def main():
filename = "tips1.html"
doc = create_doc_from_filename(filename)
parse(doc)
if __name__ == '__main__':
main()
接下來我們將 news_title.txt 這個文本文件中的漢字進行分詞,并生成詞云。代碼如下:
import jieba
import wordcloud
import matplotlib.pyplot as plt
def create_ciyun():
text = ""
with open ("news_title.txt", encoding="utf-8") as fo:
text = fo.read()
split_list = jieba.lcut(text)
final_text = " ".join(split_list)
stopwords= ["的", "是", "了"]
# Windows 系統的 font_path 替換為'C:\Windows\Fonts\STZHONGS.ttf'
wc = wordcloud.WordCloud(font_path = r"C:\Windows\Fonts\STZHONGS.TTF", width=1000, height=700, background_color="white",max_words=100,stopwords = stopwords)
wc.generate(final_text)
plt.imshow(wc)
plt.axis("off")
plt.show()
然后,在 main 函數中調用:
def main():
filename = "tips1.html"
doc = create_doc_from_filename(filename)
parse(doc)
create_ciyun()
為了方便閱讀,這里我也把整合好的代碼放出來:
# -*- coding: utf-8 -*-
# @Author: AI悅創(chuàng)
# @Date: 2021-09-15 22:15:30
# @Last Modified by: aiyc
# @Last Modified time: 2021-09-15 23:21:44
import jieba
import wordcloud
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
def create_doc_from_filename(filename):
with open(filename, "r", encoding='utf-8')as f:
html_content = f.read()
doc = BeautifulSoup(html_content, "lxml")
return doc
def parse(doc):
post_list = doc.find_all("div",class_="post-info")
result = []
for post in post_list:
link = post.find_all("a")[1]
result.append(link.text.strip())
result_str="\n".join(result)
with open("news_title.txt", "w", encoding='utf-8') as fo:
fo.write(result_str)
def create_ciyun():
text = ""
with open ("news_title.txt", encoding="utf-8") as fo:
text = fo.read()
split_list = jieba.lcut(text)
final_text = " ".join(split_list)
stopwords= ["的", "是", "了"]
# Windows 系統的 font_path 替換為'C:\Windows\Fonts\STZHONGS.ttf'
wc = wordcloud.WordCloud(font_path = r"C:\Windows\Fonts\STZHONGS.TTF", width=1000, height=700, background_color="white",max_words=100,stopwords = stopwords)
wc.generate(final_text)
plt.imshow(wc)
plt.axis("off")
plt.show()
def main():
filename = "tips1.html"
doc = create_doc_from_filename(filename)
parse(doc)
create_ciyun()
if __name__ == '__main__':
main()
不過還是建議閱讀源代碼文件,源代碼文件我此片段最后會放出來。
輸出結果如下:
如果你想生成自己的詞云,首先你需要想清楚你的數據來源,一般是一個網頁或者一個文本文件。
如果是網頁的話可以首先保存到本地,提取文本,之后就可以進行代碼替換來生成了。(對于網頁文件,需要自行提取文本咯,實在不會就把網頁的文件的內容,復制出來。保存成 .txt格式文件。如果是文本,直接復制在 text,再執(zhí)行下文即可。)
我們代碼模板,實際是下面這個模板:
def create_ciyun():
text = ""
with open ("news_title.txt", encoding="utf-8") as fo:
text = fo.read()
split_list = jieba.lcut(text)
final_text = " ".join(split_list)
stopwords= ["的", "是", "了"]
# Windows 系統的 font_path 替換為'C:\Windows\Fonts\STZHONGS.ttf'
wc = wordcloud.WordCloud(font_path = r"C:\Windows\Fonts\STZHONGS.TTF", width=1000, height=700, background_color="white",max_words=100,stopwords = stopwords)
wc.generate(final_text)
plt.imshow(wc)
plt.axis("off")
plt.show()
替換說明:

替換為你準備的網頁或者文本文件的文件名。
PS:上面的模板生成的詞語適合非專業(yè)的使用,畢竟如果要較真的話,還是很糙的。
代碼:https://github.com/AndersonHJB/AIYC_DATA/tree/main/02-玩轉圖表,實現數據可視化/2.2%20從文本文件中生成詞云
“AI悅創(chuàng)·推出輔導班啦,包括「Python 語言輔導班、C++輔導班、算法/數據結構輔導班、少兒編程、pygame 游戲開發(fā)」,全部都是一對一教學:一對一輔導 + 一對一答疑 + 布置作業(yè) + 項目實踐等。QQ、微信在線,隨時響應!V:Jiabcdefh
”
黃家寶丨AI悅創(chuàng)
隱形字
攝影公眾號「悅創(chuàng)攝影研習社」
在這里分享自己的一些經驗、想法和見解。
長按識別二維碼關注


