如何设置带有不同颜色错误栏的标记?

How to set markers with errorbars in different colours?

如何:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D  # for legend handle

fig, ax = plt.subplots(figsize = (10,10))

times = [1, 2, 3, 4, 5]
rvs = [2, 4, 2, 4, 7]
sigma = [0.564, 0.6, 0.8, 0.8, 0.4]
rv_telescopes = ['A', 'B', 'A', 'C', 'C']

d = {'rv_times': times, 'rv_rvs': rvs, 'rv_sigma': sigma, 'rv_telescopes': rv_telescopes }
df = pd.DataFrame(data=d)

colors = {'A':'#008f00', 'B':'#e36500', 'C':'red'}

plt.errorbar(df['rv_times'], df['rv_rvs'], df['rv_sigma'], marker = '_', ecolor = df['rv_telescopes'].map(colors), color = df['rv_telescopes'].map(colors), zorder = 1, ms = 30)


handles = [Line2D([0], [0], marker='_', color='w', markerfacecolor=v, label=k, markersize=10) for k, v in colors.items()]

ax.legend(handles=handles, loc='upper left', ncol = 2, fontsize=14)

plt.show()

编辑后

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D  # for legend handle
import pandas as pd
import numpy as np

times = [1, 2, 3, 4, 5]
rvs = [2, 4, 2, 4, 7]
sigma = [0.564, 0.6, 0.8, 0.8, 0.4]
rv_telescopes = ['A', 'B', 'A', 'C', 'C']

d = {'rv_times': times, 'rv_rvs': rvs, 'rv_sigma': sigma, 'rv_telescopes': rv_telescopes}
df = pd.DataFrame(data=d)
colors = {'A': '#008f00', 'B': '#e36500', 'C': 'red'}

fig, ax = plt.subplots(figsize=(10, 10))
ax.errorbar(df['rv_times'], df['rv_rvs'], df['rv_sigma'], color='none', ecolor=df['rv_telescopes'].map(colors) ,linewidth=1)
ax.scatter(df['rv_times'], df['rv_rvs'], marker='_', linewidth=3, color=df['rv_telescopes'].map(colors), s=1000)

for rv_teles in np.unique(df['rv_telescopes']):
     color = colors[rv_teles]
     df1 = df[df['rv_telescopes'] == rv_teles]  # filter out rows corresponding to df['rv_telescopes']
     ax.errorbar(df1['rv_times'], df1['rv_rvs'], df1['rv_sigma'],
                 color=color, ls='', marker='_', ms=30, linewidth=3, label=rv_teles)
ax.legend(loc='upper left', ncol=1, fontsize=14)
plt.show()

plt.errorbar()plt.plot() 非常相似,但带有额外的参数。因此,它主要使用单一颜色绘制折线图。可以通过 ecolor= 参数为误差条赋予单独的颜色。然而,标记的颜色与折线图相同。折线图可以通过空 linestyle 来抑制。最重要的是,plt.scatter() 可以用不同的颜色绘制标记。

为了不混淆 'object-oriented' 和 'functional interface',以下示例代码使用 ax.errorbar()ax.scatter()

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D  # for legend handle
import pandas as pd
import numpy as np

times = [1, 2, 3, 4, 5]
rvs = [2, 4, 2, 4, 7]
sigma = [0.564, 0.6, 0.8, 0.8, 0.4]
rv_telescopes = ['A', 'B', 'A', 'C', 'C']

d = {'rv_times': times, 'rv_rvs': rvs, 'rv_sigma': sigma, 'rv_telescopes': rv_telescopes}
df = pd.DataFrame(data=d)
colors = {'A': '#008f00', 'B': '#e36500', 'C': 'red'}

fig, ax = plt.subplots(figsize=(10, 10))
ax.errorbar(df['rv_times'], df['rv_rvs'], df['rv_sigma'], color='none', ecolor=df['rv_telescopes'].map(colors))
ax.scatter(df['rv_times'], df['rv_rvs'], marker='_', color=df['rv_telescopes'].map(colors), s=100)

handles = [Line2D([0], [0], linestyle='', marker='_', color=v, label=k, markersize=10) for k, v in colors.items()]
ax.legend(handles=handles, loc='upper left', ncol=1, fontsize=14)
plt.show()

一种更简单的方法是多次调用 ax.errorbar(),每种颜色调用一次。这将自动创建适当的图例句柄:

for rv_teles in np.unique(df['rv_telescopes']):
     color = colors[rv_teles]
     df1 = df[df['rv_telescopes'] == rv_teles]  # filter out rows corresponding to df['rv_telescopes']
     ax.errorbar(df1['rv_times'], df1['rv_rvs'], df1['rv_sigma'],
                 color=color, ls='', marker='_', ms=30, label=rv_teles)
ax.legend(loc='upper left', ncol=1, fontsize=14)
plt.show()