为了账号安全,请及时绑定邮箱和手机立即绑定

矩阵 cmap 颜色的顺序不同

矩阵 cmap 颜色的顺序不同

ABOUTYOU 2022-09-13 17:18:37
我在同一图上绘制了两个数据帧,以及每个数据集具有相同cmap的每个数据集的均值。但是,将 cmap 应用于不同数据集的颜色顺序是不同的。有人可以指出我做错了什么吗?这是输出。如您所见,标记具有相同的形状,但颜色不同(x):代码如下:import matplotlibimport pandas as pdimport matplotlib.pyplot as pltimport numpy as np#readingdf1 = 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 woax = 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 dataframeax = 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 axesplt.ylim(0,40)plt.xlim(-0.5,6.2)#add the labelsplt.ylabel('Average Efficiency')#make sure all the ticks are visibleplt.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 legendplt.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 fontfont = {'family' : 'normal',        'weight' : 'normal',        'size'   : 10}matplotlib.rc('font', **font)plt.show()print('done')
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

奇怪的事情正在发生,可能是熊猫与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 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()

//img1.sycdn.imooc.com//63204b3300012d8f23230687.jpg

查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信