在matplotlib中,是否有方法固定或排列具有字符和数字的混合类型的x值顺序?

在matplotlib中,是否有方法固定或排列具有字符和数字的混合类型的x值顺序?,matplotlib,x-axis,Matplotlib,X Axis,matplotlib中的x值有多个Q/A,当x值为int或float时显示,matploblit按x的正确顺序绘制图形。例如,在“字符类型”中,曲线图按以下顺序显示x个值: 1 15 17 2 21 7 etc NN10 NN15 NN20 NN22 NN8 etc 但当它变成int时,它就变成了 1 2 7 15 17 21 etc 按照人类的秩序。 如果x值与字符和数字混合,例如 NN8 NN10 NN15 NN20 NN22 etc 绘图将按顺序显示 1 15 17 2 21 7

matplotlib中的x值有多个Q/A,当x值为int或float时显示,matploblit按x的正确顺序绘制图形。例如,在“字符类型”中,曲线图按以下顺序显示x个值:

1 15 17 2 21 7 etc
NN10 NN15 NN20 NN22 NN8 etc
但当它变成int时,它就变成了

1 2 7 15 17 21 etc
按照人类的秩序。 如果x值与字符和数字混合,例如

NN8 NN10 NN15 NN20 NN22 etc
绘图将按顺序显示

1 15 17 2 21 7 etc
NN10 NN15 NN20 NN22 NN8 etc
是否有一种方法可以在不删除x值中的“NN”的情况下修复x值在人类顺序中的顺序或x列表中的现有顺序

更详细地说,xvalues是目录名,在linux函数中使用grep sort,结果显示在linux终端中,如下所示,可以保存在文本文件中

joonho@login:~/NDataNpowN$ get_TEFrmse NN 2 | sort -n -t N -k 3
NN7 0.3311
NN8 0.3221
NN9 0.2457
NN10 0.2462
NN12 0.2607
NN14 0.2635
如果没有排序,linux shell也会按机器顺序显示,例如

NN10 0.2462
NN12 0.2607
NN14 0.2635
NN7 0.3311
NN8 0.3221
NN9 0.2457

正如我所说,pandas将使这项任务比处理基本Python列表等更容易:

import matplotlib.pyplot as plt
import pandas as pd

#imports the text file assuming that your data are separated by space, as in your example above
df = pd.read_csv("test.txt", delim_whitespace=True, names=["X", "Y"])
#extracting the number in a separate column, assuming you do not have terms like NN1B3X5
df["N"] = df.X.str.replace(r"\D", "", regex=True).astype(int)
#this step is only necessary, if your file is not pre-sorted by Linux
df = df.sort_values(by="N")

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))

#categorical plotting
df.plot(x="X", y="Y", ax=ax1)
ax1.set_title("Evenly spaced")

#numerical plotting
df.plot(x="N", y="Y", ax=ax2)
ax2.set_xticks(df.N)
ax2.set_xticklabels(df.X)
ax2.set_title("Numerical spacing")

plt.show()
样本输出:

因为你问是否有一个非熊猫的解决方案-当然。熊猫让一些事情变得更方便。在这种情况下,我将回到numpy。Numpy是matplotlib依赖项,因此与pandas不同,如果使用matplotlib,则必须安装它:

import matplotlib.pyplot as plt
import numpy as np
import re

#read file as strings
arr = np.genfromtxt("test.txt", dtype="U15")
#remove trailing strings
Xnums = np.asarray([re.sub(r"\D", "", i) for i in arr[:, 0]], dtype=int)
#sort array 
arr = arr[np.argsort(Xnums)]
#extract x-values as strings...
Xstr = arr[:, 0]
#...and y-values as float
Yvals = arr[:, 1].astype(float)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))

#categorical plotting
ax1.plot(Xstr, Yvals)
ax1.set_title("Evenly spaced")

#numerical plotting
ax2.plot(np.sort(Xnums), Yvals)
ax2.set_xticks(np.sort(Xnums))
ax2.set_xticklabels(Xstr)
ax2.set_title("Numerical spacing")

plt.show()
样本输出:


数字是否总是以“NN”作为前缀,或者是否也可以是列表
ABC7、DE12、F34、GH114
?最简单的方法是将文本文件读入pandas(如果pandas是一个选项),创建一个额外的数字列,按它对df排序,然后绘制值。NN8-NN13-NN110应该均匀分布还是反映数字之间的距离?两者都可以。但是如果它被数字隔开,它会更好。这太棒了。脚本的哪一行使它在x值的顺序上与python不同?还是这是熊猫的天性?它是按照df中数据的顺序绘制的吗?我不确定我是否正确理解了这个问题。Pandas在排序方面与基本Python相同。我们在这里要做的是创建一个helper列
N
,它只提取带有
str.replace(…)
的数字,根据此列对数据框进行排序,然后使用新的排序顺序进行打印。如果在第一种情况下直接打印
X
的字符串,分类数据将根据索引进行打印和标记。在第二种情况下,您必须指定在数据点的编号处设置记号,然后添加相应的字符串标签。我看到了您现在删除的注释,并添加了一种非熊猫方法来解决此问题。正如您最初所说,使用熊猫编码很简单。当我开始学习Python时,我有点犹豫不决,不想领养努比和熊猫。在Python之上学习这一点真的值得吗?我今天的回答是:是的。是的。如果你了解Python的基本原理,那么使用这些库真的很容易。它们提供了多种加速或简化事情的可能性。