Python 使用熊猫绘制1D多行图

Python 使用熊猫绘制1D多行图,python,pandas,matplotlib,plot,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 matplotl

我有一个包含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)
它确实有效,但我认为它可以改进。提前感谢。

您可以与
axis=1一起使用,以便按行处理:

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

plot(df_lines)
我向nice添加了在numpy框架中使用的可能性。就性能而言,它相当于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)

将线组织在
线集合中时,Matplotlib可以节省大量绘制线的时间。您创建了一个对象,而不是像其他答案那样绘制50个单独的
hline

这样的
LineCollection
需要一组线顶点作为输入,它的形状必须是
(线的数量、每行的点数,2)
。所以在这种情况下,
(50,2,2)


迄今为止的最佳优化,当使用500行进行测试时,您开始看到您使用它获得了很多性能。不错:)
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()