簡體   English   中英

如何在子圖 x 軸上對值進行排序

[英]How to order values on the subplots x-axis

我使用了另一個示例中的這段代碼,所以我不確定在哪里進行更改。 我所有的條都按降序排列,x 值按頻率組織,但我想按 x 軸組織條,x 軸值按升序排列。 所以從 0.7 到 4.3。 如何更新我的代碼,以便它們按 x 軸值升序排列?

圖形圖像

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()
  • 順序的問題是無序字符串被用作數字等級。
    1. 排序問題可以通過將字母等級映射到數字而不是字符串來解決。
    2. 可以通過將字母設置為有序的分類類型來解決排序問題。
  • 這應該是countplot ,而不是histogram ,因為沒有對數據進行binned以傳達分布,而只是對每個類別的數據進行計數。
    • 代碼顯示正在繪制ax.bar(dftemp.index, list(dftemp))
  • 通過使用.stack()將 dataframe 轉換為長格式,然后使用seaborn.catplot
    • seaborn是 matplotlib 的高級matplotlib
  • 版本:
    • pandas v1.2.3
    • seaborn v0.11.1
    • matplotlib v3.3.4 - seaborn & pandas依賴項。

進口測試DataFrame

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

Map 字母等級到數字

# numeric grade
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 of letter grades with numeric values (not string values)
grade_map = dict(zip(grades, nums))

# print(grade_map) and see that letter grades are now mapped to numbers, not strings
{'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.0}

# stack the dataframe
dfl = df.stack().reset_index(name='grades').drop(['level_0'], axis=1).rename({'level_1': 'classes'}, axis=1)

# map grades to numbers
dfl['grades_num'] = dfl.grades.map(grade_map)

# display(dfl.head(3))
            classes grades  grades_num
0     EECS545_grade     A-         3.7
1     ECON101_grade      B         3.0
2  ENGLISH125_grade      A         4.0

# plot dfl
sns.catplot(data=dfl, col='classes', col_wrap=3, x='grades_num', kind='count', color='lightgreen')

在此處輸入圖像描述

將字母等級設置為分類和有序

  • 實際上沒有必要將字母等級轉換為數字等級
  • 使用pd.Categoricalordered=True'grades'列設置為Category類型。
# stack the dataframe
dfl = df.stack().reset_index(name='grades').drop(['level_0'], axis=1).rename({'level_1': 'classes'}, axis=1)

# convert grades letters to categorical and ordered
dfl.grades = pd.Categorical(dfl.grades, categories=grades, ordered=True)

# plot grades
sns.catplot(data=dfl, col='classes', col_wrap=3, x='grades', kind='count', color='orchid')

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM