用熊猫绘制1D多行图

时间:2017-09-21 13:21:27

标签: python pandas matplotlib plot

我有一个x1和x2列的数据框。我想将每一行绘制为一维线,其中x1是开始,x2是结束。跟着我有我的解决方案,这不是很酷。此外,在同一图中绘制900条线时速度很慢。

创建一些示例数据:

import numpy as np
import pandas as pd    
df_lines = pd.DataFrame({'x1': np.linspace(1,50,50)*2, 'x2': np.linspace(1,50,50)*2+1})

我的解决方案:

import matplotlib.pyplot as plt
def plot(dataframe):
    plt.figure()
    for item in dataframe.iterrows():
        x1 = int(item[1]['x1'])
        x2 = int(item[1]['x2'])
        plt.hlines(0,x1,x2)

plot(df_lines)

它实际上有效,但我认为它可以改进。提前谢谢。

3 个答案:

答案 0 :(得分:4)

您可以将DataFrame.applyaxis=1一起用于按行处理:

def plot(dataframe):
    plt.figure()
    dataframe.apply(lambda x: plt.hlines(0,x['x1'],x['x2']), axis=1)

plot(df_lines)

答案 1 :(得分:3)

当Matplotlib在hlines中组织时,可以节省大量绘制线条的时间。与其他答案一样,不是绘制50个单独的LineCollection,而是创建一个单独的对象。

这样的(number of lines, points per line, 2)需要一个行顶点数组作为输入,它需要是(50,2,2)形状。所以在这种情况下import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.collections import LineCollection df_lines = pd.DataFrame({'x1': np.linspace(1,50,50)*2, 'x2': np.linspace(1,50,50)*2+1}) segs = np.zeros((len(df_lines), 2,2)) segs[:,:,0] = df_lines[["x1","x2"]].values fig, ax = plt.subplots() line_segments = LineCollection(segs) ax.add_collection(line_segments) ax.set_xlim(0,102) ax.set_ylim(-1,1) plt.show()

{{1}}

enter image description here

答案 2 :(得分:2)

我使用@jezrael response在numpy框架中添加了很好的numpy.apply_along_axis可能性。性能方面,它等同于DataFrame.apply:

def plot(dataframe):
    plt.figure()
    np.apply_along_axis(lambda x: plt.hlines(0,x[0],x[1]), 1,dataframe.values)
    plt.show()

plot(df_lines)