Python matplotlib畫圖y軸數值不按大小排列問題
阿新 • • 發佈:2021-07-21
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/。