在matplotlib中绘制类似分类的数字

时间:2018-03-03 23:38:41

标签: python-3.x pandas matplotlib

我有一个看起来像这样的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转换为字符串,但它已经排序,从而使图形错误。

解决此问题的最佳方法是什么?

非常感谢!

1 个答案:

答案 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()
    

在这两种情况下,情节看起来都是

enter image description here