失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题

echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题

时间:2023-03-09 02:00:09

相关推荐

echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题

matplotlib 画图的时候经常会出现y轴数据不按大小排列的问题,很混乱,这主要是因为数据类型的错误,导致的!大家可以仔细阅读下以下两个案例,就应该有答案了:

案例一:

昨天偶然做一个爬取数据,做成直方图的小练习发现,最后出来的图标Y轴并不是按顺序排列,按照老规矩,百度一下,找到了原因,一个低级的问题

import matplotlib.pyplot as pltfrom matplotlib.pyplot import MultipleLocatorimport bs4import numpy as npimport matplotlibimport seaborn as snsimport requestsimport pandas as pd# import pickledef datas() :#封装爬取数据函数,以便后续使用url = '/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_scorereturn 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 npimport matplotlibimport matplotlib.pyplot as pltimport osmy_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 npimport matplotlibimport matplotlib.pyplot as pltimport osmy_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 字段类型转换 就可以了,每个人代码不一样,我就不写了。

如果觉得《echarts x轴像直尺一样设置刻度_Python matplotlib画图y轴数值不按大小排列问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。