1 回答
TA贡献1818条经验 获得超3个赞
奇怪的事情正在发生,可能是熊猫与matplotlib一起工作的某种错误:每当标记是小写字母时,它似乎并不服从给定的色彩映射表,它只是遵循“prop_cycle”。
以下是两种解决方法。最简单的方法是避免所有这些小写字母标记并选择不同的标记。
另一种解决方法是显式设置颜色周期,并在绘制第二部分时重置它。请注意,从 viridis 色彩映射表中选择 9 种间距相等的颜色。如果没有设置明确的数字,viridis有256种颜色,其中8种颜色都非常相似(深紫色)。我们选择9种颜色,后来忽略最后一种颜色,因为黄色对于此应用程序来说对比度太小。(别忘了省略大熊猫的论点)。cmap = plt.cm.get_cmap('viridis', 9)
cmap
plot
显式颜色循环可以更好地控制使用哪些颜色。您还可以选择例如cmap = plt.cm.get_cmap(“Dark2”),
它只有较暗的颜色,并且与白色背景具有足够的对比度。
下面是一些代码来演示它是如何工作的:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
df1 = pd.DataFrame(np.random.randint(10, 25, size=(7, 8)), columns=list('ABCDEFGH'))
df2 = pd.DataFrame(np.random.randint(30, 45, size=(7, 8)), columns=list('ABCDEFGH'))
# create a color map with 9 colors from viridis
cmap = plt.cm.get_cmap('viridis', 9)
fig, ax = plt.subplots(figsize=(8, 4))
markers = ['.', '*', '1', '2', '3', '4', '+', 'x']
# plot the first dataframe
# set the prop_cycle to use 8 colors from the given colormap
ax.set_prop_cycle(color=cmap.colors[0:8])
df1.plot(style=markers, ax=ax)
df1.mean(axis=1).plot(c='red', style='--', label='M1 mean', ax=ax)
# plot the second dataframe
ax.set_prop_cycle(color=cmap.colors[0:8])
df2.plot(ax=ax, style=markers)
df2.mean(axis=1).plot(ax=ax, c='black', style='--', label='M3 mean')
plt.ylim(0, 45)
plt.xlim(-0.5, 6.2)
plt.ylabel('Average Efficiency')
plt.xticks(range(7), ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
# change the legend
plt.legend(title='Groups', bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.1, ncol=2)
font = {'family': 'normal',
'weight': 'normal',
'size': 10}
matplotlib.rc('font', **font)
plt.tight_layout()
plt.show()
添加回答
举报