[英]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()
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
依賴項。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
# 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.Categorical
和ordered=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.