Pandas 数据框线图:显示随机标记
Posted
技术标签:
【中文标题】Pandas 数据框线图:显示随机标记【英文标题】:Pandas Dataframe Line Plot: Show Random Markers 【发布时间】:2017-01-07 20:06:34 【问题描述】:我经常有包含许多观察的数据框,并希望使用折线图快速浏览数据。
问题在于颜色图的颜色要么在 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()
提供:
是否也可以为每一行绘制一个(随机)标记?
提前致谢!
【问题讨论】:
请接受 Jarana 的回答。这是更好的选择。 【参考方案1】:首先我们需要选择随机标记。它可以通过包含所有可用标记的matplotlib.markers.MarkerStyle.markers
字典来完成。标记也意味着“什么都没有”,以“勾号”和“插入符号”开头应该删除一些更多information abour 标记。让我们用有效的标记制作列表,然后从它们中随机选择绘制 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)
例如:
In [146]: list(markers )
Out[146]: ['H', '^', 'v', 's', '3', '.', '1', '_']
然后对于标记,您可以绘制数据框,并通过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')
原文:
修改:
【讨论】:
感谢您的回答!如果在 pandas 中实现这一点会很酷,这样人们就可以使用像“random_markers=True”这样的标志。但这已经帮助了我。 @CordKaldemeyer 是的,这可能是功能请求的一个很好的理由。 @CordKaldemeyer 感谢您的请求。我也发现这个可能的功能很有用。【参考方案2】:pandas
使用matplotlib
作为绘图的默认后端。要为每行定义不同的标记和线型,您可以将list
传递给style
参数,其中列表中的每个值都遵循matplotlib.pyplot.plot
中的fmt
约定(例如'[marker][line][color]'
):
df.plot(style=['+-', 'o-', '.--', 's:'])
这也可以包括 1 个字母的颜色缩写
df.plot(style=['+-y','o-b','.--g','s:k'])
【讨论】:
【参考方案3】:您可以尝试使用以下代码使用随机标记进行绘图。您还可以调整轴和图例的大小。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from pandas import DataFrame
value1 = [10, 20, 30, 40, 50]
value2 = [5, 10, 15, 20, 25]
value3 = [8, 9, 10, 15, 20]
results1 = DataFrame('SAC': value1, 'TD3': value2, 'DDPG': value3)
color_dict = 'SAC': '#FF0000', 'TD3': '#0000FF', 'DDPG': '#008000'
# 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')])
markers = np.random.choice(valid_markers, results1.shape[1], replace=False)
res1 = results1.plot(fontsize=10, linewidth=3, figsize=(10, 8), markersize=16, color=[color_dict.get(x, '#333333') for x in results1.columns])
for i, line in enumerate(res1.get_lines()):
line.set_marker(markers[i])
plt.legend(fontsize=20, loc='lower right')
plt.xlabel("Episode", fontsize=20)
plt.ylabel("Rewards", fontsize=20)
plt.show()
输出:
【讨论】:
以上是关于Pandas 数据框线图:显示随机标记的主要内容,如果未能解决你的问题,请参考以下文章