[英]Matplotlib cmap colours are not in the same order
我在同一个图上绘制两个数据框,以及每个数据集的平均值与每个数据集的相同 cmap。 但是,cmap 应用于不同数据集的颜色顺序是不同的。 有人可以指出我们做错了什么吗?
这是输出。 如您所见,标记具有相同的形状,但颜色不同(x):
这是代码:
import matplotlib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#reading
df1 = pd.DataFrame(np.random.randint(10,20,size=(7, 8)), columns=list('ABCDEFGH'))
df2 = pd.DataFrame(np.random.randint(30,40,size=(7, 8)), columns=list('ABCDEFGH'))
#plot the first DataFrame
#trying to select the first 8 RGBA codes from viridis - does not wo
ax = df1.plot(style = ['.','*','1','2','3','4','+','x'],figsize=(8,4),cmap = 'Accent')
#ax.set_prop_cycle(cycler(color = cmap.colors[0:7]))
ax = df1.mean(axis=1).plot(c='red',style = '--',label = 'M1 mean')
#plot the second dataframe
ax = df2.mean(axis=1).plot(ax=ax,c='black',style = '--',label = 'M3 mean')
ax = df2.plot(ax=ax,style = ['.','*','1','2','3','4','+','x'],cmap = 'Accent')
#fiddle with the axes
plt.ylim(0,40)
plt.xlim(-0.5,6.2)
#add the labels
plt.ylabel('Average Efficiency')
#make sure all the ticks are visible
plt.xticks(np.arange(0,7),np.arange(0,7))
plt.xticks([0,1,2,3,4,5,6],['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])
#change the legend
plt.legend([1,2,3,4,5,6,7,8,'M1_mean','M3 mean'],title = 'Groups',bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.1)
#increase the font
font = {'family' : 'normal',
'weight' : 'normal',
'size' : 10}
matplotlib.rc('font', **font)
plt.show()
print('done')
发生了一些奇怪的事情,可能是熊猫如何与 matplotlib 一起工作的某种错误:每当标记是小写字母时,它似乎不遵守给定的颜色图,它只是遵循“prop_cycle”。
这里有两个解决方法。 最简单的就是避免所有这些小写字母标记并选择不同的标记。
另一种解决方法是显式设置颜色循环,并在绘制第二部分时将其重置。 请注意, cmap = plt.cm.get_cmap('viridis', 9)
从 viridis 颜色图中选择 9 个等距颜色。 如果没有设置明确的数字,viridis 有 256 种颜色,其中第 8 种颜色非常相似(深紫色)。 我们选择了 9 种颜色,后来忽略了最后一种,因为黄色对于这个应用程序来说对比度太小。 (不要忘记从 pandas plot
省略cmap
参数)。
明确的颜色循环可以更好地控制所使用的颜色。 你也可以选择例如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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.