Python 如何在子地块x轴上排序值

Python 如何在子地块x轴上排序值,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我使用了另一个示例中的代码,因此我不确定在哪里进行更改。我所有的条形图都是以降序排列的,x轴值按频率排列,但我想以x轴值按升序排列条形图。从0.7升到4.3。如何对代码进行更新,使其按x轴值升序排列 顺序的问题是无序字符串被用作数字等级。 排序问题可以通过将字母等级映射到数字而不是字符串来解决 通过将字母设置为有序分类类型,可以解决排序问题 这应该是一个countplot,而不是一个直方图,因为数据没有被装箱来传递分布,只是对每个类别的数据进行计数。 代码显示正在绘制的ax.bar(df

我使用了另一个示例中的代码,因此我不确定在哪里进行更改。我所有的条形图都是以降序排列的,x轴值按频率排列,但我想以x轴值按升序排列条形图。从0.7升到4.3。如何对代码进行更新,使其按x轴值升序排列

  • 顺序的问题是无序字符串被用作数字等级。
  • 排序问题可以通过将字母等级映射到数字而不是字符串来解决
  • 通过将字母设置为有序分类类型,可以解决排序问题
  • 这应该是一个
    countplot
    ,而不是一个
    直方图
    ,因为数据没有被
    装箱
    来传递分布,只是对每个类别的数据进行计数。
    • 代码显示正在绘制的
      ax.bar(dftemp.index,list(dftemp))
  • 通过使用
    .stack()
    将数据帧转换为长格式,然后使用
    seaborn.catplot
    ,只需四行代码即可绘制整个绘图。
    • seaborn
      matplotlib
  • 版本:
    • 熊猫1.2.3版
    • seaborn v0.11.1
    • matplotlib v3.3.4
      -
      seaborn
      &
      pandas
      依赖关系
导入和测试数据帧 将字母等级映射到数字
#数字等级
nums=[4.3,4.0,3.7,3.3,3.0,2.7,2.3,2.0,1.7,1.3,1.0,0.7,0.0]
#使用数值(非字符串值)记录字母等级
等级地图=dict(zip(等级,NUM))
#打印(grade_map)并查看字母等级现在映射到数字,而不是字符串
{'A+':4.3,'A':4.0,'A-':3.7,'B+':3.3,'B':3.0,'B-':2.7,'C':2.0,'C-':1.7,'D+':1.0,'D-':0.7,'E':0.0}
#堆叠数据帧
dfl=df.stack().reset_index(name='grades').drop(['level_0'],axis=1)。重命名({'level_1':'classes'},axis=1)
#将等级映射到数字
dfl['grades\u num']=dfl.grades.map(grade\u map)
#显示器(dfl.磁头(3))
班级等级数量
0 EECS545_A级-3.7
1经济101_B级3.0
2英语125_A级4.0
#绘图dfl
catplot(数据=dfl,列class='classes',列wrap=3,x='grades\u num',种类class='count',颜色class='浅绿色')

将字母等级设置为分类和有序
  • 实际上没有必要将字母等级转换为数字等级
  • 使用
    pd.Category
    ordered=True
    'grades'
    列设置为
    类别
    类型
#堆叠数据帧
dfl=df.stack().reset_index(name='grades').drop(['level_0'],axis=1)。重命名({'level_1':'classes'},axis=1)
#将等级字母转换为分类和排序
dfl.grades=pd.Categorical(dfl.grades,categories=grades,ordered=True)
#地块坡度
sns.catplot(数据=dfl,col='classes',col_wrap=3,x='grades',kind='count',color='rutch')

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

def grade_distribution():
    
    # importing datasets
    df=pd.read_csv('assets/class_grades.csv')
    
    # dropping first column
    df.drop(df.columns[[0]], axis=1,inplace=True)

    # updating grade values
    df['EECS545_grade'] = df['EECS545_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    df['ECON101_grade'] = df['ECON101_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    df['ENGLISH125_grade'] = df['ENGLISH125_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    df['MATH217_grade'] = df['MATH217_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    df['DATASCI306_grade'] = df['DATASCI306_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    df['STATS250_grade'] = df['STATS250_grade'].replace({'A+': '4.3', 'A': '4.0', 'A-': '3.7', 'B+': '3.3', 'B': '3.0', 'B-': '2.7', 'C+': '2.3', 'C': '2.0', 'C-': '1.7', 'D+': '1.3', 'D': '1.0', 'D-': '0.7', 'E': '0'}) 
    
    # dropping NaN values
    df.dropna(inplace=True)
    
    cols_to_plot = ['EECS545_grade','ECON101_grade', 'ENGLISH125_grade','MATH217_grade', 'DATASCI306_grade', 'STATS250_grade']
    fig, axs = plt.subplots(nrows=2, ncols=3)
    fig.set_size_inches(20, 10)
    fig.subplots_adjust(wspace=0.2)
    fig.subplots_adjust(hspace=0.5)
    
    for col, ax in zip(cols_to_plot, axs.flatten()):
        dftemp = df[col].value_counts()
        ax.bar(dftemp.index, list(dftemp))
        ax.set_title(col)
        ax.tick_params(axis='x', labelrotation=30)

    plt.show()
    
grade_distribution()
import pandas as pd
import numpy as np  # for test data
import seaborn as sns

# test data
np.random.seed(365)

classes = ['EECS545_grade','ECON101_grade', 'ENGLISH125_grade','MATH217_grade', 'DATASCI306_grade', 'STATS250_grade']
grades = ['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'E']
grades_array = np.random.choice(grades, (1000, 6))

# given a wide dataframe 
df = pd.DataFrame(grades_array, columns=classes)

# display(df.head(3))
  EECS545_grade ECON101_grade ENGLISH125_grade MATH217_grade DATASCI306_grade STATS250_grade
0            A-             B                A            D-                E             B-
1            A-            A-               D+             D               C-              B
2            A+             E               B+            B+                C              C