我有一个看起来像这样的csv:
2 1111
4 926
8 914
16 933
32 911
64 912
128 1010
256 1010
512 1013
1024 1070
1025 921
1026 921
1027 920
1028 918
1029 917
1030 916
1031 922
1032 927
1033 929
1034 924
2048 1048
第一列是X,第二列是Y。
当我尝试绘制它时, matplotlib 会将其视为数字,从而给出间隔。
我更喜欢将第一列视为分类( 2,4,8,...,2048 ),每个x值之间的距离相同。
我尝试将X转换为分类,但matplotlib仍将其视为数字:
x = pd.Series(line_data["element"]).astype("category")
plt.scatter(x, line_data["time"])
我也尝试将X转换为字符串,但它已经排序,从而使图形错误。
解决此问题的最佳方法是什么?
非常感谢!
答案 0 :(得分:2)
Matplotlib可以从当前版本开始不处理分类pandas数据类型。
您拥有的选项:
使用字符串
(正如问题中所指出的)此解决方案适用于matplotlib 2.2或更高版本。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"x" : np.logspace(0,11,12, base=2).astype(int),
"y" : np.random.randint(900,1200,12)})
plt.plot(df.x.astype(str),df.y)
plt.show()
绘制数据索引
并根据值设置ticklabels。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"x" : np.logspace(0,11,12, base=2).astype(int),
"y" : np.random.randint(900,1200,12)})
plt.plot(df.index,df.y)
plt.xticks(df.index, df.x)
plt.show()
在这两种情况下,情节看起来都是