Cor*_*yer 5 python matplotlib pandas
我经常有包含许多观察的数据框,并希望使用线图快速浏览数据。
问题是颜色图的颜色要么在 X 次观察中重复,要么难以区分,例如在顺序颜色图的情况下。
所以我的想法是在我卡住的线图中添加随机标记。
这是一个带有一种标记样式的示例:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# dataframe with random data
df = pd.DataFrame(np.random.rand(10, 8))
# plot
df.plot(kind='line', marker='d')
plt.show()
Run Code Online (Sandbox Code Playgroud)
它提供:
是否也可以为每条线绘制一个(随机)标记?
提前致谢!
小智 7
pandas用作matplotlib绘图的默认后端。要为每条线定义不同的标记和线型,您可以将 a 传递list给style参数,其中列表中的每个值都遵循以下fmt约定matplotlib.pyplot.plot(例如'[marker][line][color]'):
df.plot(style=['+-', 'o-', '.--', 's:'])
Run Code Online (Sandbox Code Playgroud)
这还可以包括 1 个字母的颜色缩写
df.plot(style=['+-y','o-b','.--g','s:k'])
Run Code Online (Sandbox Code Playgroud)
首先我们需要选择随机标记。它可以通过matplotlib.markers.MarkerStyle.markers包含所有可用标记的字典来完成。标记也意味着“没有”,以“tick”开头,“caret”应该去掉。关于标记的更多信息。让我们使用有效标记列出列表,然后从中随机选择绘制 DataFrame 所需的数量,或者您可以使用第二个选项filled_markers:
import matplotlib as mpl
import numpy as np
# create valid markers from mpl.markers
valid_markers = ([item[0] for item in mpl.markers.MarkerStyle.markers.items() if
item[1] is not 'nothing' and not item[1].startswith('tick')
and not item[1].startswith('caret')])
# use fillable markers
# valid_markers = mpl.markers.MarkerStyle.filled_markers
markers = np.random.choice(valid_markers, df.shape[1], replace=False)
Run Code Online (Sandbox Code Playgroud)
例如:
In [146]: list(markers )
Out[146]: ['H', '^', 'v', 's', '3', '.', '1', '_']
Run Code Online (Sandbox Code Playgroud)
然后对于标记,您可以绘制数据框,并通过set_marker方法为每行设置标记。然后你可以在你的情节中添加图例:
import pandas as pd
np.random.seed(2016)
df = pd.DataFrame(np.random.rand(10, 8))
ax = df.plot(kind='line')
for i, line in enumerate(ax.get_lines()):
line.set_marker(markers[i])
# for adding legend
ax.legend(ax.get_lines(), df.columns, loc='best')
Run Code Online (Sandbox Code Playgroud)
原来的:
修改的: