incrediblejack 发表于 2020-6-10 22:32:03

一个关于列表绘制的问题,问题表现为纵坐标没按照从大到小顺序排布

数据集说明:我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:38:47

本帖最后由 BIO-张磊 于 2020-6-11 09:43 编辑

楼主,有更安全更方便的pandas库处理你这个数据,你都知道numpy库了,为什么不使用pandas库呢?
pandas 可以兼容maplotlib库,画图也更方便,如果需要,我给你发代码

BIO-张磊 发表于 2020-6-11 09:50:21

本帖最后由 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我就不细说了

BIO-张磊 发表于 2020-6-11 09:56:46

此外,你原始数据的丢失问题,可以使用numpy库对weight数据进行NaN填充,或者去除,因为pandas库的基础就是numpy库

BIO-张磊 发表于 2020-6-11 10:00:25

至于你说的数据不是从大到小的问题,我简单看了一下你代码的最后结果,确实是的,
我的理解可能是,因为你转置了坐标轴,横坐标本来是数据,纵坐标是天数,
但你把横坐标变成了纵坐标,原本横坐标是不需要遵循由大到小的顺序的,你原来什么样,就是什么样,不知道这么说你明不明白。

incrediblejack 发表于 2020-6-11 12:09:29

BIO-张磊 发表于 2020-6-11 10:00
至于你说的数据不是从大到小的问题,我简单看了一下你代码的最后结果,确实是的,
我的理解可能是,因为你 ...

坐标轴没有转变的,横纵坐标没有对调呀

incrediblejack 发表于 2020-6-11 12:10:09

BIO-张磊 发表于 2020-6-11 09:38
楼主,有更安全更方便的pandas库处理你这个数据,你都知道numpy库了,为什么不使用pandas库呢?
pandas 可 ...

嗯我今天上午已经用pandas库写啦

BIO-张磊 发表于 2020-6-11 12:13:31

incrediblejack 发表于 2020-6-11 12:09
坐标轴没有转变的,横纵坐标没有对调呀

可能是这句代码,invert_yaxis翻译一下就叫反转轴

incrediblejack 发表于 2020-6-11 12:14:43

我放弃了之前的思路了,用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%还多。

incrediblejack 发表于 2020-6-11 12:15:38

BIO-张磊 发表于 2020-6-11 09:50
我把你的列名全部给加上去了,excel里面看到到的原始数据如下
天数        体重        BMI        体脂        骨骼肌含量        内脏脂肪等 ...

我刚看到你发的这个,我已经用pandas重新写了哈,还是谢啦!虽然我没试试你的,还是给你最佳答案吧哈哈
页: [1]
查看完整版本: 一个关于列表绘制的问题,问题表现为纵坐标没按照从大到小顺序排布