【问题标题】:Python pandas, Plotting options for multiple linesPython pandas,多行的绘图选项
【发布时间】:2012-12-20 03:13:17
【问题描述】:

我想从 pandas 数据框中绘制多条线,并为每条线设置不同的选项。我想做类似的事情

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3))
testdataframe.plot(style=['s-','o-','^-'],color=['b','r','y'],linewidth=[2,1,1])

这会引发一些错误消息:

  • 线宽不能用列表调用

  • 在样式中,在列表中定义颜色时,我不能使用“s”和“o”或任何其他字母符号

还有一些我觉得很奇怪的东西

  • 当我在上述代码testdataframe[0].plot() 中添加另一个绘图命令时,它将在同一绘图中绘制这条线,如果我添加命令testdataframe[[0,1]].plot(),它将创建一个新绘图

  • 如果我打电话给testdataframe[0].plot(style=['s-','o-','^-'],color=['b','r','y']),可以使用样式列表,但不能使用颜色列表

希望有人能帮忙,谢谢。

【问题讨论】:

    标签: python plot pandas


    【解决方案1】:

    你离得太近了!

    您可以在样式列表中指定颜色:

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    testdataframe = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C'])
    styles = ['bs-','ro-','y^-']
    linewidths = [2, 1, 4]
    fig, ax = plt.subplots()
    for col, style, lw in zip(testdataframe.columns, styles, linewidths):
        testdataframe[col].plot(style=style, lw=lw, ax=ax)
    

    还要注意plot 方法可以接受matplotlib.axes 对象,因此您可以像这样进行多次调用(如果您愿意的话):

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    testdataframe1 = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C'])
    testdataframe2 = pd.DataFrame(np.random.normal(size=(4,3)), columns=['D', 'E', 'F'])
    styles1 = ['bs-','ro-','y^-']
    styles2 = ['rs-','go-','b^-']
    fig, ax = plt.subplots()
    testdataframe1.plot(style=styles1, ax=ax)
    testdataframe2.plot(style=styles2, ax=ax)
    

    在这种情况下不太实用,但这个概念以后可能会派上用场。

    【讨论】:

    • 感谢您的帮助,但这对线宽没有帮助?我也想使用一些自定义颜色,例如 own_color='#FF0000' 然后它不能这样调用。
    • 那么我只能考虑遍历列。查看我对第一个示例的修改。
    • 是的,这就是我现在正在使用的。但我只是想知道他们是否只是这种直接任务的笨拙方式。但是非常感谢您的帮助!
    • 这是一个很好的答案,但对于@Joerg 的观点,是否只有几行代码就可以做到这一点?这是一项看似简单的任务。
    • @zthomas.nc 如果你经常做这样的事情,你可能想使用 seaborn
    【解决方案2】:

    考虑到数据框testdataframe

    testdataframe = pd.DataFrame(np.arange(12).reshape(4,3))
    
    print(testdataframe)
    
       0   1   2
    0  0   1   2
    1  3   4   5
    2  6   7   8
    3  9  10  11
    

    您可以将styles 组合成一个字符串列表,如下面的styles 定义。我还将在lws中定义线宽

    styles=['bs-', 'ro-', 'y^-']
    lws = [2, 1, 1]
    

    我们可以在testdataframe 上使用plot 方法,将列表styles 传递给style 参数。请注意,我们也可以传递字典(可能还有其他东西)。

    但是,线宽不是那么容易处理的。我首先捕获AxesSubplot 对象并遍历设置线宽的lines 属性。

    ax = testdataframe.plot(style=styles)
    for i, l in enumerate(ax.lines):
        plt.setp(l, linewidth=lws[i])
    

    【讨论】:

      【解决方案3】:

      所以我认为答案在于在同一个参数中传递颜色和样式。以下示例适用于 pandas 0.19.2:

      testdataframe=pd.DataFrame(np.arange(12).reshape(4,3))
      testdataframe.plot(style=['r*-','bo-','y^-'], linewidth=2.0)
      

      不幸的是,似乎不可能将多个线宽作为输入传递给 matplotlib。

      【讨论】:

      • 这就是为什么你总是一直向下滚动。
      猜你喜欢
      • 2021-09-11
      • 2021-10-24
      • 1970-01-01
      • 2020-02-14
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2014-10-12
      相关资源
      最近更新 更多