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