矩阵 cmap 颜色的顺序不同

我在同一图上绘制了两个数据帧,以及每个数据集具有相同cmap的每个数据集的均值。但是,将 cmap 应用于不同数据集的颜色顺序是不同的。有人可以指出我做错了什么吗?

这是输出。如您所见,标记具有相同的形状,但颜色不同(x):

http://img1.mukewang.com/63204b0000018b1307960397.jpg

代码如下:


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')


ABOUTYOU
浏览 136回答 1
1回答

泛舟湖上清波郎朗

奇怪的事情正在发生,可能是熊猫与matplotlib一起工作的某种错误:每当标记是小写字母时,它似乎并不服从给定的色彩映射表,它只是遵循“prop_cycle”。以下是两种解决方法。最简单的方法是避免所有这些小写字母标记并选择不同的标记。另一种解决方法是显式设置颜色周期,并在绘制第二部分时重置它。请注意,从 viridis 色彩映射表中选择 9 种间距相等的颜色。如果没有设置明确的数字,viridis有256种颜色,其中8种颜色都非常相似(深紫色)。我们选择9种颜色,后来忽略最后一种颜色,因为黄色对于此应用程序来说对比度太小。(别忘了省略大熊猫的论点)。cmap = plt.cm.get_cmap('viridis', 9)cmapplot显式颜色循环可以更好地控制使用哪些颜色。您还可以选择例如cmap = plt.cm.get_cmap(“Dark2”),它只有较暗的颜色,并且与白色背景具有足够的对比度。下面是一些代码来演示它是如何工作的:import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlibdf1 = 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 viridiscmap = 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 colormapax.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 dataframeax.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 legendplt.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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python