matplotlib 畫圖的時候經常會出現y軸資料不按大小排列的問題,很混亂,這主要是因為資料類型的錯誤,導緻的!大家可以仔細閱讀下以下兩個案例,就應該有答案了:
案例一:
昨天偶然做一個爬取資料,做成直方圖的小練習發現,最後出來的圖示Y軸并不是按順序排列,按照老規矩,百度一下,找到了原因,一個低級的問題
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
import bs4
import numpy as np
import matplotlib
import seaborn as sns
import requests
import pandas as pd
# import pickle
def datas() :#封裝爬取資料函數,以便後續使用
url = 'https://www.iqiyi.com/dianying_new/i_list_paihangbang.html'
#按照擷取的URL進行入參
res = requests.get(url)
#擷取網頁内容
# print(res.status_code)
#檢查連接配接狀态
bs = bs4.BeautifulSoup(res.text, 'html.parser')
#用BS解釋網頁
datas = bs.find('ul',class_="site-piclist").find_all('li')
#根據網頁特征定位相關資料位置
data1 = {}#設定相應字典,用來裝爬取到的資料并且傳回
for data in datas :
mov_name = data.find('img')['title'] # 擷取電影名字
try :
mov_rank = data.find('span',class_='dypd_piclist_nub dypd_piclist_nubHot').text #擷取電影排名,由于前三特征與後面的不同,是以采用試錯曆遍相關特征
except :
mov_rank = data.find('span',class_='dypd_piclist_nub').text #同上
mov_score = data.find('span',class_='score').text #擷取電影評分資料
data1[int(mov_rank)]=mov_score
return data1 # 傳回擷取到的資料
#-----------------------------------------------------------2.對資料進行清洗和處理---------------------------------
data_dict= datas() #提取前述資料進行處理
rate1=list(data_dict.keys())
rate2=list(data_dict.values())
d={' 排名 ':rate1,
' 評分 ':rate2}
df=pd.DataFrame(d) #将年份和比率結合一起
# print(df) #輸出結果
#-----------------------------------------------------------4.對資料進行清洗和處理---------------------------------
#-----------------------------------------------------------折線圖---------------------------------
# x=rate1 #設定x軸
# y=rate2
# plt.figure(figsize=(200,8),dpi=80) #設定繪制的圖像和字型大小
# plt.plot(x,rate2,color = 'y',label="score")#k是黃色
# plt.xlabel("rank")#橫坐标名字
# plt.ylabel("score")#縱坐标名字
# x_major_locator=MultipleLocator(10)
# #把x軸的刻度間隔設定為10,并存在變量裡
# ax=plt.gca()
# #ax為兩條坐标軸的執行個體
# ax.xaxis.set_major_locator(x_major_locator)
# #把x軸的主刻度設定為10的倍數
# plt.xlim(1,146)
# #把x軸的刻度範圍設定為1到146,十倍間隔
# plt.legend(loc = "best")#圖例
# plt.show()
代碼為上述,但是出來的結果如圖
解決方案:
經過一番查證後發現其實是爬取資料的時候評分字段的資料類型是文本= =
是以多加一個int或者float就可以解決對應問題
for data in datas :
mov_name = data.find('img')['title'] # 擷取電影名字
try :
mov_rank = data.find('span',class_='dypd_piclist_nub dypd_piclist_nubHot').text #擷取電影排名,由于前三特征與後面的不同,是以采用試錯曆遍相關特征
except :
mov_rank = data.find('span',class_='dypd_piclist_nub').text #同上
mov_score = data.find('span',class_='score').text #擷取電影評分資料
data1[int(mov_rank)]=float(mov_score)
輸出結果
案例二:
這是一個遇到過幾次的問題,每次查完資料不做記錄,結果就是每次都要浪費時間再查一次。這次做好備好。
目标:讀一個文檔裡的資料,畫個圖
先上代碼:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import os
my_font = matplotlib.font_manager.FontProperties(fname = '/usr/share/fonts/opentype/noto/simsun.ttc')
model_path = '/home/will/test/score.txt'
data = []
for line in open(model_path,"r"):
det = '%.2f'%np.float(line[:-1].split(' ')[6])
data.append(det)
da = np.array(data)
x = np.arange(0, 50, 1)
plt.plot(x, da)
plt.ylabel('分數',fontproperties=my_font, fontsize = 10) # 橫坐标軸的标題
plt.xlabel('幀數',fontproperties=my_font, fontsize = 18) # 縱坐标軸的标題
#plt.grid() # 顯示網格
plt.show()
結果,Y軸的資料明顯有問題,亂來,都不按大小排列了。
問題就出在,我從文檔中讀取了資料之後,儲存的時候沒把它儲存在浮點數
float
的形式,錯誤的儲存成了字元串
str
形式,這個問題老是不注意,以後要長記性,稍微改一下代碼即可:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import os
my_font = matplotlib.font_manager.FontProperties(fname = '/usr/share/fonts/opentype/noto/simsun.ttc')
model_path = '/home/will/test/score.txt'
data = []
for line in open(model_path,"r"):
det = '%.2f'%np.float(line[:-1].split(' ')[6])
det = float(det)
data.append(det)
da = np.array(data)
x = np.arange(0, 50, 1)
plt.plot(x, da)
plt.ylabel('分數',fontproperties=my_font, fontsize = 10) # 橫坐标軸的标題
plt.xlabel('幀數',fontproperties=my_font, fontsize = 18) # 縱坐标軸的标題
#plt.grid() # 顯示網格
plt.show()
然後就OK了
我的按照案例一基本上就解決了,把資料類型改成浮點型即可,具體怎麼改,大家可以參考
python dataframe astype 字段類型轉換 就可以了,每個人代碼不一樣,我就不寫了。