Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用第三列值将颜色渐变映射到第1列和第2列的绘图;Matplotlib_Python_Pandas_Matplotlib_Colormap - Fatal编程技术网

Python 使用第三列值将颜色渐变映射到第1列和第2列的绘图;Matplotlib

Python 使用第三列值将颜色渐变映射到第1列和第2列的绘图;Matplotlib,python,pandas,matplotlib,colormap,Python,Pandas,Matplotlib,Colormap,我有一个3列的数据框。我使用df['name']作为x轴,df['value1']作为y轴。我想使用第三列(df['value2'])为条形图生成颜色渐变 正在使用的数据 df['name']是名称。df['value1']是主要测量值。df['value2']是df['value1']值的置信度度量。我认为在颜色渐变中显示df['value2']将产生强大的视觉效果 问题 我已经尝试了很多方法来实现matplotlib.colors模块,但都没有产生我想要的结果。这是代码的基础(没有到df['

我有一个3列的数据框。我使用df['name']作为x轴,df['value1']作为y轴。我想使用第三列(df['value2'])为条形图生成颜色渐变

正在使用的数据

df['name']是名称。df['value1']是主要测量值。df['value2']是df['value1']值的置信度度量。我认为在颜色渐变中显示df['value2']将产生强大的视觉效果

问题

我已经尝试了很多方法来实现matplotlib.colors模块,但都没有产生我想要的结果。这是代码的基础(没有到df['value2']的颜色映射)

输入

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors


df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)


colorbar_1 = LinearSegmentedColormap.from_list('colorbar', ['#990000','#FF6666'], N=100)
df[['name','value1']].plot(kind='bar', colormap=colorbar_1 ,width=0.8, ylim=[9,16], fontsize=5)
plt.xticks(df.index,df['name'].values, rotation=90)
plt.ylim([9,16])
plt.gcf().subplots_adjust(bottom=0.15)
plt.tight_layout()
plt.savefig('test.png',dpi=600)
plt.show()
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors

df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)

norm = mpl.colors.Normalize(vmin=0, vmax=16, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)
df['hex_code'] = df['value2'].apply(lambda x: colors.to_hex(mapper.to_rgba(x)))
print(df)
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
  name  value1  value2 hex_code
0    a    10.1     1.5  #482374
1    b    13.3     2.0  #472d7b
2    c     9.5     3.5  #3e4989
3    d    15.1     1.3  #481d6f
输出

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors


df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)


colorbar_1 = LinearSegmentedColormap.from_list('colorbar', ['#990000','#FF6666'], N=100)
df[['name','value1']].plot(kind='bar', colormap=colorbar_1 ,width=0.8, ylim=[9,16], fontsize=5)
plt.xticks(df.index,df['name'].values, rotation=90)
plt.ylim([9,16])
plt.gcf().subplots_adjust(bottom=0.15)
plt.tight_layout()
plt.savefig('test.png',dpi=600)
plt.show()
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors

df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)

norm = mpl.colors.Normalize(vmin=0, vmax=16, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)
df['hex_code'] = df['value2'].apply(lambda x: colors.to_hex(mapper.to_rgba(x)))
print(df)
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
  name  value1  value2 hex_code
0    a    10.1     1.5  #482374
1    b    13.3     2.0  #472d7b
2    c     9.5     3.5  #3e4989
3    d    15.1     1.3  #481d6f
结果:

所需格式

[

我还生成了第四列,其中包含生成的十六进制代码,可用于执行手头的任务。我假设有更简单的方法合并df['value2'],但生成十六进制代码可能很方便

输入

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors


df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)


colorbar_1 = LinearSegmentedColormap.from_list('colorbar', ['#990000','#FF6666'], N=100)
df[['name','value1']].plot(kind='bar', colormap=colorbar_1 ,width=0.8, ylim=[9,16], fontsize=5)
plt.xticks(df.index,df['name'].values, rotation=90)
plt.ylim([9,16])
plt.gcf().subplots_adjust(bottom=0.15)
plt.tight_layout()
plt.savefig('test.png',dpi=600)
plt.show()
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors

df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)

norm = mpl.colors.Normalize(vmin=0, vmax=16, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)
df['hex_code'] = df['value2'].apply(lambda x: colors.to_hex(mapper.to_rgba(x)))
print(df)
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
  name  value1  value2 hex_code
0    a    10.1     1.5  #482374
1    b    13.3     2.0  #472d7b
2    c     9.5     3.5  #3e4989
3    d    15.1     1.3  #481d6f
输出

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors


df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)


colorbar_1 = LinearSegmentedColormap.from_list('colorbar', ['#990000','#FF6666'], N=100)
df[['name','value1']].plot(kind='bar', colormap=colorbar_1 ,width=0.8, ylim=[9,16], fontsize=5)
plt.xticks(df.index,df['name'].values, rotation=90)
plt.ylim([9,16])
plt.gcf().subplots_adjust(bottom=0.15)
plt.tight_layout()
plt.savefig('test.png',dpi=600)
plt.show()
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors as colors

df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
print(df)

norm = mpl.colors.Normalize(vmin=0, vmax=16, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)
df['hex_code'] = df['value2'].apply(lambda x: colors.to_hex(mapper.to_rgba(x)))
print(df)
  name  value1  value2
0    a    10.1     1.5
1    b    13.3     2.0
2    c     9.5     3.5
3    d    15.1     1.3
  name  value1  value2 hex_code
0    a    10.1     1.5  #482374
1    b    13.3     2.0  #472d7b
2    c     9.5     3.5  #3e4989
3    d    15.1     1.3  #481d6f

问题之一是使用
df[['name','value1']].plot
使pandas认为数据帧中每行需要两个条形,一个条形代表“name”,一个条形代表“value1”。然后pandas会感到困惑,因为它无法为“name”绘制条形图并跳过这些条形图。然后,对于
color=
参数,pandas现在认为颜色列表中的第一个颜色代表“name”,第二个颜色代表“value1”

因此,首先,您需要将其命名为
df['value1'].plot()
。然后,pandas非常喜欢使用x轴的索引。要将“name”作为索引,只需将其作为数据帧的索引即可

将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从matplotlib.colors导入ListedColormap、LinearSegmentedColormap、Normalize
df={'name':['a','b','c','d'],'value1':[10.1,13.3,9.5,15.1],'value2':[1.5,2.0,3.5,1.3]}
df=pd.DataFrame(df)
df.set_索引('name',inplace=True)
打印(df)
colormap_1=LinearSegmentedColormap.from_列表('colorbar',['''#990000','#FF6666'],N=100)
norm=正常化(vmin=min(df['value2']),vmax=max(df['value2']))
颜色=[colormap_1(范数(v))表示df中的v['value2']]
df['value1'].绘图(kind='bar',color=colors,width=0.8,ylim=[9,16],fontsize=5)
plt.xticks(旋转=90)
plt.ylim([9,16])
plt.紧_布局()
plt.savefig('test.png',dpi=600)
plt.show()

PS:要获得与链接图像相似的内容(因此不使用“value2”),您可以尝试:

#与以前相同的数据帧,以“name”作为索引
ymin=9
ymax=16
条形图=df['value1']。绘图(种类='bar',宽度=0.8,ylim=[ymin,ymax],字体大小=5)
plt.xticks(旋转=90)
渐变=np.linspace(1,0256)。重塑(256,1)
对于barplot.containers[0]中的条形图:
条。设置面颜色(“无”)
x、 y=bar.get_xy()
w、 h=bar.get_width(),bar.get_height()
plt.imshow(梯度,范围=[x,x+w,y+ymin,y+h],aspect=“auto”,cmap='bone')
plt.imshow(gradient,extent=[*plt.xlim(),*plt.ylim()],aspect=“auto”,cmap='cuper\u r',zorder=-1)
plt.紧_布局()
#plt.savefig('test.png',dpi=600)
plt.show()