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 数据框线图:显示随机标记的主要内容,如果未能解决你的问题,请参考以下文章

有箱线图,想用值标记中值和胡须

如何从按连续变量分层的 Pandas 数据框中获取分层随机样本

在熊猫数据框中添加随机噪声和随机 NA

一次将 pandas 数据帧随机分组以进行 x 折交叉验证

如何用随机字典值填充熊猫数据框列

如何使用 pandas 创建交叉表来显示随机森林预测器的预测结果?