首页 > 解决方案 > 如何通过使用pyplot减少y轴的值来对散点图进行排序?

问题描述

我有一个数据框 df1 ,其中包含两列 freq 和 RN,其中数据按 freq 升序排序。

    In [2]: df1.head()
    Out[2]: 
       freq  RN
    147 1   181
    56  1   848
    149 1   814
    25  1   829

我想绘制一个散点图,其中 X 轴为 RN,y 轴为频率,其中 X 值按 y 值的升序排列,即。我希望 x 轴排列为 841,848,835,... 如 df1 中给出的,它已根据频率值的升序排序。

现在,如果我写 plt.scatter('RN', 'freq',data=df1)输出 x 轴,我得到的不是按频率的升序排序。它按照自己的自然升序排列,例如 800,801,...,860。

注意: plt.bar('RN', 'freq',data=df1)以我想要的正确方式工作。

在此处输入图像描述

我该如何改变它?

标签: pythonmatplotlib

解决方案


  • 如果RN列是数字,绘图 API 将按数字对其进行排序。
  • RN如果您将列类型设置为 ,则可以做到这一点str
    • 如果 中的值RN是唯一的,则此方法效果最佳。如果它们不是唯一的,则非唯一的所有freqRN将被绘制在一起。
    • 如果RN不是唯一的,则绘图 API 无法区分一个值与另一个值。

非唯一 RN (a)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# create test data
np.random.seed(365)
data = {'freq': np.random.randint(20, size=(20,)), 'RN': np.random.randint(800, 900, size=(20,))}
df = pd.DataFrame(data)

# convert RN to a str type
df.RN = df.RN.astype(str)

# sort freq
df.sort_values('freq', ascending=True, inplace=True)

# plot
plt.scatter('RN', 'freq', data=df)

在此处输入图像描述

非唯一 RN (b)

  • 用于pandas.DataFrame.groupby将非唯一 RN 分组在一起
# create test data
# create test data
np.random.seed(365)
data = {'freq': np.random.randint(20, size=(20,)), 'RN': np.random.randint(800, 900, size=(20,))}
df = pd.DataFrame(data)

# convert RN to a str type
df.RN = df.RN.astype(str)

# combine non-unique RN with groupby and sort by freq
dfg = df.groupby('RN', as_index=False)['freq'].sum().sort_values('freq')

# plot
plt.scatter('RN', 'freq', data=dfg)

在此处输入图像描述

独特的注册护士

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# create test data
np.random.seed(365)
data = {'freq': np.random.randint(20, size=(20,)), 'RN': np.arange(800, 820)}
df = pd.DataFrame(data)

# convert RN to a str type
df.RN = df.RN.astype(str)

# sort `freq`
df.sort_values('freq', ascending=True, inplace=True)

# plot
plt.scatter('RN', 'freq', data=df)

在此处输入图像描述


推荐阅读