一个关于列表绘制的问题,问题表现为纵坐标没按照从大到小顺序排布
数据集说明:我105天以来的减肥情况统计,分别记录了体重、BMI指标、体脂等一共10项参数。具体可以参见代码上的注释。但是出来的图的效果,却是纵坐标没有按照由大到小的顺序排列,(由于我没有权限上传图片,我就不上传了哈)
我想让它纵坐标按照由大到小排布,应该怎么改呢?
附数据集:https://pan.baidu.com/s/1CLV9haAgIfVHX9mfyOsDwQ提取码2vgu
附上代码:
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import xlrd
import xlwt
import typing
workbook = xlwt.Workbook(encoding='utf-8')
booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
train1 = xlrd.open_workbook('jianfei.xlsx')#读取原始数据文件
table1 = train1.sheets() #提第一页sheet
#print(table1.describe())
len_train = 105 #设置取用数据长度(可更改)
a =
for i in range(len_train): #
a = table1.row_values(i) #这个对应了第1列,是体重
b = #
for i in range(len_train): #
b=table1.row_values(i) #这个对应了第0列,是天数
c = #
for i in range(len_train): #
c=table1.row_values(i) #这个对应了第2列,是BMI指数
d = #
for i in range(len_train): #
d=table1.row_values(i) #这个对应了第3列,是体脂
e = #
for i in range(len_train): #
e=table1.row_values(i) #这个对应了第4列,是骨骼肌含量
f = #
for i in range(len_train): #
f=table1.row_values(i) #这个对应了第5列,是内脏脂肪等级
g = #
for i in range(len_train): #
g=table1.row_values(i) #这个对应了第6列,是代谢
h = #
for i in range(len_train): #
h=table1.row_values(i) #这个对应了第7列,是水分
ii = #
for i in range(len_train): #
ii=table1.row_values(i) #这个对应了第8列,是含盐量
jj = #
for i in range(len_train): #
jj=table1.row_values(i) #这个对应了第9列,是蛋白质含量
kk = #
for i in range(len_train): #
kk=table1.row_values(i) #这个对应了第10列,是肌肉含量
ll = #
for i in range(len_train): #
ll=table1.row_values(i) #这个对应了第11列,是测得身体年龄
plt.figure(figsize=(10,15))
#plt.subplot(511)
plt.plot(b,a)
plt.gca().invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'体重变化情况 单位:kg', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#plt.subplot(512)
plt.plot(b,c)
plt.gca().invert_yaxis()
# plt.yaxis.set_ticks_position('right')
# plt.invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'BMI变化情况 ', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#plt.subplot(513)
plt.plot(b,d)
plt.gca().invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'体脂变化情况 单位:%', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#plt.subplot(514)
plt.plot(b,f)
plt.gca().invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'内脏脂肪等级变化情况 单位:等级', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#plt.subplot(515)
plt.plot(b,kk)
plt.gca().invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'肌肉含量变化情况 单位:kg', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#plt.subplot(515)
plt.plot(b,ll)
plt.gca().invert_yaxis()
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'身体年龄变化情况 单位:岁', fontproperties='FangSong')
plt.show()
谢谢!
本帖最后由 BIO-张磊 于 2020-6-11 09:43 编辑
楼主,有更安全更方便的pandas库处理你这个数据,你都知道numpy库了,为什么不使用pandas库呢?
pandas 可以兼容maplotlib库,画图也更方便,如果需要,我给你发代码 本帖最后由 BIO-张磊 于 2020-6-11 09:52 编辑
我把你的列名全部给加上去了,excel里面看到到的原始数据如下
天数 体重 BMI 体脂 骨骼肌含量 内脏脂肪等级 代谢 水分 含盐量 蛋白质含量 肌肉含量 身体年龄
1 82.8 24.5 22.4 33.6 11 1820 53.6 3.5 19.8 60.8 35
2 82.6 24.4 22.3 33.6 11 1817 53.6 3.5 19.9 60.7 35
。。。。。。。。
。。。。。。。。
代码如下,主要是使用pandas把excel导入进来成一个数据框,跟你在excel里面看到的形式差不多
import matplotlib.pyplot as plt
import pandas as pd
weight = pd.read_excel("jianfei.xlsx",index_col = 0)#读取数据,并使用第0列也就是天数列作为index,jianfei.xlsx是相对路径
for each in weight:#对列名进行索引
weight.plot()#每一张都以index列作为横坐标,列名作为纵坐标
plt.show()
##当然你可以不使用for循环,一张张画也行
weight["体重"].plot()
plt.show()
weight["BMI"].plot()
plt.show()
###....
##至于座标问题和title问题,你会用matplotlib我就不细说了 此外,你原始数据的丢失问题,可以使用numpy库对weight数据进行NaN填充,或者去除,因为pandas库的基础就是numpy库 至于你说的数据不是从大到小的问题,我简单看了一下你代码的最后结果,确实是的,
我的理解可能是,因为你转置了坐标轴,横坐标本来是数据,纵坐标是天数,
但你把横坐标变成了纵坐标,原本横坐标是不需要遵循由大到小的顺序的,你原来什么样,就是什么样,不知道这么说你明不明白。 BIO-张磊 发表于 2020-6-11 10:00
至于你说的数据不是从大到小的问题,我简单看了一下你代码的最后结果,确实是的,
我的理解可能是,因为你 ...
坐标轴没有转变的,横纵坐标没有对调呀 BIO-张磊 发表于 2020-6-11 09:38
楼主,有更安全更方便的pandas库处理你这个数据,你都知道numpy库了,为什么不使用pandas库呢?
pandas 可 ...
嗯我今天上午已经用pandas库写啦 incrediblejack 发表于 2020-6-11 12:09
坐标轴没有转变的,横纵坐标没有对调呀
可能是这句代码,invert_yaxis翻译一下就叫反转轴 我放弃了之前的思路了,用pandas库写了。
原始数据集先存成.csv格式。并且加上了表头。
之后我改过的代码附上:
#-*-coding: utf-8-*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
jianfei = pd.read_csv(r'C:\Users\Administrator\PycharmProjects\feature202005\jianfei.csv',encoding='gb18030')
data = jianfei[['天数','体重','BMI','体脂','骨骼肌含量','内脏脂肪等级','代谢','水分','含盐量','蛋白质含量','肌肉含量','身体年龄变化']]
print(data)
#计算列中的最大值
def max_func(input):
sum_mid =[]
for i in range(107):
sum_mid_v1 = input
sum_mid.append(sum_mid_v1)
max_result = max(sum_mid)
return max_result
#计算列中的最小值
def min_func(input):
sum_mid =[]
for i in range(107):
sum_mid_v1 = input
sum_mid.append(sum_mid_v1)
min_result = min(sum_mid)
return min_result
#间隔变量:体重
tizhong_max = max_func(data['体重'])
tizhong_min = min_func(data['体重'])
# print(tizhong_max)
# print(tizhong_min)
tizhong_max = int(tizhong_max)
tizhong_min = int(tizhong_min)
#间隔变量:BMI
bmi_max = max_func(data['BMI'])
bmi_min = min_func(data['BMI'])
bmi_max = int(bmi_max)
bmi_min = int(bmi_min)
#间隔变量:体脂
tizhi_max = max_func(data['体脂'])
tizhi_min = min_func(data['体脂'])
tizhi_max = int(tizhi_max)
tizhi_min = int(tizhi_min)
#间隔变量:内脏脂肪等级
neizang_max = max_func(data['内脏脂肪等级'])
neizang_min = min_func(data['内脏脂肪等级'])
neizang_max = int(neizang_max)
neizang_min = int(neizang_min)
# jiange = 0.1
# jiange = float(jiange)
#间隔变量:肌肉含量
jirou_max = max_func(data['肌肉含量'])
jirou_min = min_func(data['肌肉含量'])
jirou_max = int(jirou_max)
jirou_min = int(jirou_min)
#间隔变量:身体年龄变化
bodyage_max = max_func(data['身体年龄变化'])
bodyage_min = min_func(data['身体年龄变化'])
bodyage_max = int(bodyage_max)
bodyage_min = int(bodyage_min)
plt.figure(figsize=(10,15))
#体重:
x=range(1,107,5)
y=range(tizhong_min,tizhong_max+1,1)
plt.scatter(data['天数'],data['体重'])
plt.plot(data['天数'],data['体重'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'体重变化情况 单位:kg', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#BMI:
x=range(1,107,5)
y=range(bmi_min,bmi_max+1, 1)
plt.scatter(data['天数'],data['BMI'])
plt.plot(data['天数'],data['BMI'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'BMI变化情况 ', fontproperties='FangSong')
#mid = int(0.1)
plt.figure(figsize=(10,15))
#体脂
x=range(1,107,5)
y=range(tizhi_min,tizhi_max+1, 1)
plt.scatter(data['天数'],data['体脂'])
plt.plot(data['天数'],data['体脂'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'体脂变化情况 单位: %', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#内脏脂肪等级
x=range(1,107,5)
y=range(neizang_min,neizang_max+1,1)
plt.scatter(data['天数'],data['内脏脂肪等级'])
plt.plot(data['天数'],data['内脏脂肪等级'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'内脏脂肪等级变化情况 ', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#肌肉含量变化
x=range(1,107,5)
y=range(jirou_min,jirou_max+1,1)
plt.scatter(data['天数'],data['肌肉含量'])
plt.plot(data['天数'],data['肌肉含量'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'肌肉含量变化情况 单位:kg', fontproperties='FangSong')
plt.figure(figsize=(10,15))
#身体年龄
x=range(1,107,5)
y=range(bodyage_min,bodyage_max+1,1)
plt.scatter(data['天数'],data['身体年龄变化'])
plt.plot(data['天数'],data['身体年龄变化'])
plt.xticks(x)
plt.yticks(y)
plt.xlabel(u'天数', fontproperties='FangSong')
plt.title(u'身体年龄变化情况 单位:岁', fontproperties='FangSong')
plt.show()
经测试有效。
如果有人用华为体脂秤,或者其他体脂秤,也可以用这个方法可视化哈。
ps:为啥我想写这个,因为我想看肌肉含量变化,总感觉减肥过程中肌肉也少了。
2020年过年后到现在,我体重减了20多斤呢。体脂下降了5%还多。 BIO-张磊 发表于 2020-6-11 09:50
我把你的列名全部给加上去了,excel里面看到到的原始数据如下
天数 体重 BMI 体脂 骨骼肌含量 内脏脂肪等 ...
我刚看到你发的这个,我已经用pandas重新写了哈,还是谢啦!虽然我没试试你的,还是给你最佳答案吧哈哈
页:
[1]