鱼C论坛

 找回密码
 立即注册
查看: 1087|回复: 9

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

[复制链接]
发表于 2020-6-10 22:32:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
数据集说明:我105天以来的减肥情况统计,分别记录了体重、BMI指标、体脂等一共10项参数。具体可以参见代码上的注释。
但是出来的图的效果,却是纵坐标没有按照由大到小的顺序排列,(由于我没有权限上传图片,我就不上传了哈)
我想让它纵坐标按照由大到小排布,应该怎么改呢?
附数据集:https://pan.baidu.com/s/1CLV9haAgIfVHX9mfyOsDwQ  提取码  2vgu
附上代码:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import os
  4. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
  5. import xlrd
  6. import xlwt
  7. import typing

  8. workbook = xlwt.Workbook(encoding='utf-8')
  9. booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)

  10. train1 = xlrd.open_workbook('jianfei.xlsx')  #读取原始数据文件
  11. table1 = train1.sheets()[0]    #提第一页sheet
  12. #print(table1.describe())
  13. len_train = 105              #设置取用数据长度(可更改)
  14. a = [0 for i in range(len_train)]
  15. for i in range(len_train):             #
  16.     a[i] = table1.row_values(i)[1]       #这个对应了第1列,是体重
  17. b = [0 for i in range(len_train)]      #
  18. for i in range(len_train):             #
  19.     b[i]=table1.row_values(i)[0]       #这个对应了第0列,是天数
  20. c = [0 for i in range(len_train)]      #
  21. for i in range(len_train):             #
  22.     c[i]=table1.row_values(i)[2]       #这个对应了第2列,是BMI指数
  23. d = [0 for i in range(len_train)]      #
  24. for i in range(len_train):             #
  25.     d[i]=table1.row_values(i)[3]       #这个对应了第3列,是体脂
  26. e = [0 for i in range(len_train)]      #
  27. for i in range(len_train):             #
  28.     e[i]=table1.row_values(i)[4]       #这个对应了第4列,是骨骼肌含量
  29. f = [0 for i in range(len_train)]      #
  30. for i in range(len_train):             #
  31.     f[i]=table1.row_values(i)[5]       #这个对应了第5列,是内脏脂肪等级
  32. g = [0 for i in range(len_train)]      #
  33. for i in range(len_train):             #
  34.     g[i]=table1.row_values(i)[6]       #这个对应了第6列,是代谢
  35. h = [0 for i in range(len_train)]      #
  36. for i in range(len_train):             #
  37.     h[i]=table1.row_values(i)[7]       #这个对应了第7列,是水分
  38. ii = [0 for i in range(len_train)]      #
  39. for i in range(len_train):             #
  40.     ii[i]=table1.row_values(i)[8]       #这个对应了第8列,是含盐量
  41. jj = [0 for i in range(len_train)]      #
  42. for i in range(len_train):             #
  43.     jj[i]=table1.row_values(i)[9]       #这个对应了第9列,是蛋白质含量

  44. kk = [0 for i in range(len_train)]      #
  45. for i in range(len_train):             #
  46.     kk[i]=table1.row_values(i)[10]       #这个对应了第10列,是肌肉含量

  47. ll = [0 for i in range(len_train)]      #
  48. for i in range(len_train):             #
  49.     ll[i]=table1.row_values(i)[11]       #这个对应了第11列,是测得身体年龄

  50. plt.figure(figsize=(10,15))

  51. #plt.subplot(511)
  52. plt.plot(b,a)
  53. plt.gca().invert_yaxis()
  54. plt.xlabel(u'天数', fontproperties='FangSong')
  55. plt.title(u'体重变化情况 单位:kg', fontproperties='FangSong')

  56. plt.figure(figsize=(10,15))
  57. #plt.subplot(512)
  58. plt.plot(b,c)
  59. plt.gca().invert_yaxis()
  60. # plt.yaxis.set_ticks_position('right')
  61. # plt.invert_yaxis()
  62. plt.xlabel(u'天数', fontproperties='FangSong')
  63. plt.title(u'BMI变化情况 ', fontproperties='FangSong')

  64. plt.figure(figsize=(10,15))
  65. #plt.subplot(513)
  66. plt.plot(b,d)
  67. plt.gca().invert_yaxis()
  68. plt.xlabel(u'天数', fontproperties='FangSong')
  69. plt.title(u'体脂变化情况 单位:%', fontproperties='FangSong')

  70. plt.figure(figsize=(10,15))
  71. #plt.subplot(514)
  72. plt.plot(b,f)
  73. plt.gca().invert_yaxis()
  74. plt.xlabel(u'天数', fontproperties='FangSong')
  75. plt.title(u'内脏脂肪等级变化情况 单位:等级', fontproperties='FangSong')

  76. plt.figure(figsize=(10,15))
  77. #plt.subplot(515)
  78. plt.plot(b,kk)
  79. plt.gca().invert_yaxis()
  80. plt.xlabel(u'天数', fontproperties='FangSong')
  81. plt.title(u'肌肉含量变化情况 单位:kg', fontproperties='FangSong')

  82. plt.figure(figsize=(10,15))
  83. #plt.subplot(515)
  84. plt.plot(b,ll)
  85. plt.gca().invert_yaxis()
  86. plt.xlabel(u'天数', fontproperties='FangSong')
  87. plt.title(u'身体年龄变化情况 单位:岁', fontproperties='FangSong')
  88. plt.show()
复制代码


谢谢!
最佳答案
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[each].plot()#每一张都以index列作为横坐标,列名作为纵坐标
        plt.show()

##当然你可以不使用for循环,一张张画也行
weight["体重"].plot()
plt.show()
weight["BMI"].plot()
plt.show()
###....
##至于座标问题和title问题,你会用matplotlib我就不细说了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-11 09:38:47 | 显示全部楼层
本帖最后由 BIO-张磊 于 2020-6-11 09:43 编辑

楼主,有更安全更方便的pandas库处理你这个数据,你都知道numpy库了,为什么不使用pandas库呢?
pandas 可以兼容maplotlib库,画图也更方便,如果需要,我给你发代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[each].plot()#每一张都以index列作为横坐标,列名作为纵坐标
        plt.show()

##当然你可以不使用for循环,一张张画也行
weight["体重"].plot()
plt.show()
weight["BMI"].plot()
plt.show()
###....
##至于座标问题和title问题,你会用matplotlib我就不细说了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-11 09:56:46 | 显示全部楼层
此外,你原始数据的丢失问题,可以使用numpy库对weight数据进行NaN填充,或者去除,因为pandas库的基础就是numpy库
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-11 10:00:25 | 显示全部楼层
至于你说的数据不是从大到小的问题,我简单看了一下你代码的最后结果,确实是的,
我的理解可能是,因为你转置了坐标轴,横坐标本来是数据,纵坐标是天数,
但你把横坐标变成了纵坐标,原本横坐标是不需要遵循由大到小的顺序的,你原来什么样,就是什么样,不知道这么说你明不明白。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

坐标轴没有转变的,横纵坐标没有对调呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯我今天上午已经用pandas库写啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-11 12:13:31 | 显示全部楼层
incrediblejack 发表于 2020-6-11 12:09
坐标轴没有转变的,横纵坐标没有对调呀

可能是这句代码,invert_yaxis翻译一下就叫反转轴
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-11 12:14:43 | 显示全部楼层
我放弃了之前的思路了,用pandas库写了。
原始数据集先存成.csv格式。并且加上了表头。
之后我改过的代码附上:
  1. #-*-coding: utf-8-*-
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. jianfei = pd.read_csv(r'C:\Users\Administrator\PycharmProjects\feature202005\jianfei.csv',encoding='gb18030')
  6. data = jianfei[['天数','体重','BMI','体脂','骨骼肌含量','内脏脂肪等级','代谢','水分','含盐量','蛋白质含量','肌肉含量','身体年龄变化']]

  7. print(data)
  8. #计算列中的最大值
  9. def max_func(input):
  10.     sum_mid =[]
  11.     for i in range(107):
  12.         sum_mid_v1 = input[i]
  13.         sum_mid.append(sum_mid_v1)
  14.     max_result = max(sum_mid)
  15.     return max_result
  16. #计算列中的最小值
  17. def min_func(input):
  18.     sum_mid =[]
  19.     for i in range(107):
  20.         sum_mid_v1 = input[i]
  21.         sum_mid.append(sum_mid_v1)
  22.     min_result = min(sum_mid)
  23.     return min_result
  24. #间隔变量:体重
  25. tizhong_max = max_func(data['体重'])
  26. tizhong_min = min_func(data['体重'])
  27. # print(tizhong_max)
  28. # print(tizhong_min)
  29. tizhong_max = int(tizhong_max)
  30. tizhong_min = int(tizhong_min)

  31. #间隔变量:BMI
  32. bmi_max = max_func(data['BMI'])
  33. bmi_min = min_func(data['BMI'])
  34. bmi_max = int(bmi_max)
  35. bmi_min = int(bmi_min)

  36. #间隔变量:体脂
  37. tizhi_max = max_func(data['体脂'])
  38. tizhi_min = min_func(data['体脂'])
  39. tizhi_max = int(tizhi_max)
  40. tizhi_min = int(tizhi_min)

  41. #间隔变量:内脏脂肪等级
  42. neizang_max = max_func(data['内脏脂肪等级'])
  43. neizang_min = min_func(data['内脏脂肪等级'])
  44. neizang_max = int(neizang_max)
  45. neizang_min = int(neizang_min)
  46. # jiange = 0.1
  47. # jiange = float(jiange)
  48. #间隔变量:肌肉含量
  49. jirou_max = max_func(data['肌肉含量'])
  50. jirou_min = min_func(data['肌肉含量'])
  51. jirou_max = int(jirou_max)
  52. jirou_min = int(jirou_min)

  53. #间隔变量:身体年龄变化
  54. bodyage_max = max_func(data['身体年龄变化'])
  55. bodyage_min = min_func(data['身体年龄变化'])
  56. bodyage_max = int(bodyage_max)
  57. bodyage_min = int(bodyage_min)

  58. plt.figure(figsize=(10,15))
  59. #体重:
  60. x=range(1,107,5)
  61. y=range(tizhong_min,tizhong_max+1,1)
  62. plt.scatter(data['天数'],data['体重'])
  63. plt.plot(data['天数'],data['体重'])
  64. plt.xticks(x)
  65. plt.yticks(y)
  66. plt.xlabel(u'天数', fontproperties='FangSong')
  67. plt.title(u'体重变化情况 单位:kg', fontproperties='FangSong')

  68. plt.figure(figsize=(10,15))
  69. #BMI:
  70. x=range(1,107,5)
  71. y=range(bmi_min,bmi_max+1, 1)
  72. plt.scatter(data['天数'],data['BMI'])
  73. plt.plot(data['天数'],data['BMI'])
  74. plt.xticks(x)
  75. plt.yticks(y)
  76. plt.xlabel(u'天数', fontproperties='FangSong')
  77. plt.title(u'BMI变化情况 ', fontproperties='FangSong')

  78. #mid = int(0.1)
  79. plt.figure(figsize=(10,15))
  80. #体脂
  81. x=range(1,107,5)

  82. y=range(tizhi_min,tizhi_max+1, 1)
  83. plt.scatter(data['天数'],data['体脂'])
  84. plt.plot(data['天数'],data['体脂'])
  85. plt.xticks(x)
  86. plt.yticks(y)
  87. plt.xlabel(u'天数', fontproperties='FangSong')
  88. plt.title(u'体脂变化情况 单位: %', fontproperties='FangSong')

  89. plt.figure(figsize=(10,15))
  90. #内脏脂肪等级
  91. x=range(1,107,5)
  92. y=range(neizang_min,neizang_max+1,1)
  93. plt.scatter(data['天数'],data['内脏脂肪等级'])
  94. plt.plot(data['天数'],data['内脏脂肪等级'])
  95. plt.xticks(x)
  96. plt.yticks(y)
  97. plt.xlabel(u'天数', fontproperties='FangSong')
  98. plt.title(u'内脏脂肪等级变化情况 ', fontproperties='FangSong')

  99. plt.figure(figsize=(10,15))
  100. #肌肉含量变化
  101. x=range(1,107,5)
  102. y=range(jirou_min,jirou_max+1,1)
  103. plt.scatter(data['天数'],data['肌肉含量'])
  104. plt.plot(data['天数'],data['肌肉含量'])
  105. plt.xticks(x)
  106. plt.yticks(y)
  107. plt.xlabel(u'天数', fontproperties='FangSong')
  108. plt.title(u'肌肉含量变化情况 单位:kg', fontproperties='FangSong')

  109. plt.figure(figsize=(10,15))
  110. #身体年龄
  111. x=range(1,107,5)
  112. y=range(bodyage_min,bodyage_max+1,1)
  113. plt.scatter(data['天数'],data['身体年龄变化'])
  114. plt.plot(data['天数'],data['身体年龄变化'])
  115. plt.xticks(x)
  116. plt.yticks(y)
  117. plt.xlabel(u'天数', fontproperties='FangSong')
  118. plt.title(u'身体年龄变化情况 单位:岁', fontproperties='FangSong')
  119. plt.show()
复制代码

经测试有效。
如果有人用华为体脂秤,或者其他体脂秤,也可以用这个方法可视化哈。
ps:为啥我想写这个,因为我想看肌肉含量变化,总感觉减肥过程中肌肉也少了。
2020年过年后到现在,我体重减了20多斤呢。体脂下降了5%还多。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我刚看到你发的这个,我已经用pandas重新写了哈,还是谢啦!虽然我没试试你的,还是给你最佳答案吧哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表