繁体   English   中英

Matplotlib cmap 颜色的顺序不同

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM