问题的标题有点集中,但总的来说,我想知道是否有更有效的方法在matplotlib中为一部分行设置不同的线条样式。
例如,我在单列数据框中有随机数据:
0
0 0.750712
1 0.568953
2 0.270217
3 0.912791
4 0.313565
5 0.428776
6 0.874447
7 0.437500
8 0.295404
9 0.628610
但是,索引值5-9是预测值,因此当我绘制它们时,我希望该行(在本例中为红色和虚线)有助于将它们与其余数据区分开来。
我知道的唯一方法是正常的第二行图,但这会复制数据,我认为对于具有多列的更复杂的数据集来说会有问题且效率低下:
fig, ax = plt.subplots()
ax.plot(df[0], 'r--')
ax.plot(df.iloc[0:5, 0], 'b')
plt.show()
产生:
这是实现这一目标的最佳方式吗?或者是否有一个我不知道的参数会告诉matplot lib在x值n处使用不同的样式?
答案 0 :(得分:3)
从问题中可以清楚地看出" best"意思是。最好尽量避免"最好"在提问时。
一种简单的方法是直接使用pandas。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.DataFrame({"y" : np.random.rand(10)})
ax = df.iloc[:5,:].plot(ls="-", color="b")
df.iloc[4:,:].plot(ls="--", color="r", ax=ax)
plt.show()
如果"最好"关于抽奖时间的效率,LineCollection
是最佳方式。
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
import pandas as pd
from matplotlib.collections import LineCollection
df = pd.DataFrame({"y" : np.random.rand(10)})
fig, ax = plt.subplots()
points = np.array([df.index.values, df["y"].values]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)
colors = plt.cm.bwr_r((df.index < 4).astype(float))
ls = ["-"]*4 + ["--"]*5
lc = LineCollection(segments, colors=colors, linestyles=ls )
ax.add_collection(lc)
ax.autoscale_view()
plt.show()
答案 1 :(得分:0)