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 字段類型轉換 就可以了,每個人代碼不一樣,我就不寫了,更多的python問題,請查閱:http://www.rrdaj.com/tag/pythonxue-xi-fen-xiang/。