Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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 如何在条形图上创建和应用自定义渐变颜色贴图?_Python_Matplotlib_Ipython - Fatal编程技术网

Python 如何在条形图上创建和应用自定义渐变颜色贴图?

Python 如何在条形图上创建和应用自定义渐变颜色贴图?,python,matplotlib,ipython,Python,Matplotlib,Ipython,我对Matplotlib还比较陌生,但仍在某些方面苦苦挣扎 我试图在我的绘图上应用自定义渐变颜色,根据其在最小和最大范围内的位置填充条的颜色 我已经能够生成LinearSegmentedColormap,并使用zip函数创建了一个排序数组,但是,当我尝试将它应用于color=或color=my\u cmap(colors\u array)时,它给了我一个值错误 我想知道我的练习是否有问题,或者,如果可能的话,是否有其他方法可以解决以下问题 代码: 提前谢谢你 首先,有一个以年份为索引的数据框架,

我对Matplotlib还比较陌生,但仍在某些方面苦苦挣扎

我试图在我的绘图上应用自定义渐变颜色,根据其在最小和最大范围内的位置填充条的颜色

我已经能够生成LinearSegmentedColormap,并使用zip函数创建了一个排序数组,但是,当我尝试将它应用于
color=
color=my\u cmap(colors\u array)
时,它给了我一个值错误

我想知道我的练习是否有问题,或者,如果可能的话,是否有其他方法可以解决以下问题

代码:


提前谢谢你

首先,有一个以年份为索引的数据框架,并将所有的值放入列中,这是非常不寻常的。(但熊猫可以使用这种格式,尽管速度有点慢。)

如果我理解正确,您希望根据每年的平均值相对于其他年份的平均值的位置来分配颜色。您需要创建一个(颜色映射所需的值和范围0-1之间的映射)。然后,您可以使用colormap和该范数将每个方法映射到一种颜色

年份转换为字符串,因此matplotlib将生成一个分类x轴

以下是一些示例代码,可以帮助您开始:

将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
将matplotlib导入为mpl
从matplotlib.cm导入ScalarMapable
np.random.seed(12345)
df=pd.数据帧([np.随机.正常(3200000003650),
np.随机.正常(43000,100000,3650),
np.随机.正常(435001400003650),
np.随机.正常(48000,70000,3650)],
指数=[1992、1993、1994、1995])
plt.style.use('ggplot'))
图,ax=plt.子批次()
cmap=mpl.colors.LinearSegmentedColormap.from_列表('blue_to_red',['darkblue','darkred']))
df_平均值=df.平均值(轴=1)
norm=plt.Normalize(df_-mean.min(),df_-mean.max())
颜色=cmap(标准值(df_平均值))
轴杆(df.index.astype(str),
我的意思是,
yerr=df.std(轴=1)/np.sqrt(长度(df.columns)),
颜色=颜色)
图颜色条(可缩放(cmap=cmap,norm=norm))
ax.集_标题(“1992-1995年投票结果”,fontsize=12)
ax.set_xlabel('年')
ax.set_ylabel('平均值')
plt.紧_布局()
plt.show()

PS:表示数据框架的更标准的方法是将每年放入一列中。然后,每列的平均值可以计算为
df.mean()

df=pd.DataFrame(np.array([np.random.normal(320002003650)),
np.随机.正常(43000,100000,3650),
np.随机.正常(435001400003650),
np.随机.正常(48000,70000,3650)]).T,
列=[1992、1993、1994、1995])
df_mean=df.mean()
ax.bar(df.columns.astype(str),
我的意思是,
yerr=df.std()/np.sqrt(len(df)),
颜色=颜色)

嘿,约翰,非常感谢你的时间和回复。我想知道norm和norm有什么区别。查看文档时,颜色根据值在-、+范围内的位置而变化。我试图复制它,但得到了
TypeError:ListedColormap类型的对象没有len()
从我试图将两者压缩在一起的文档中,但是得到了
TypeError
。让我困惑的是,我遵循了文档,并想知道它为什么不起作用。尽管如此,谢谢你,Johan,我会记住
规范化的
函数以备将来使用,这让我很沮丧,我花了两天的时间在这里寻找解决方案。嗯,
zip
创建了一个元组生成器,给定了单个列表(或数组或生成器)。可以创建新数组,将元组的一部分应用于另一部分。在这种情况下,您没有合适的输入列表来压缩。太好了,非常感谢@JohanC!
import math
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

np.random.seed(12345)
df = pd.DataFrame([np.random.normal(32000, 200000, 3650),
                   np.random.normal(43000, 100000, 3650),
                   np.random.normal(43500, 140000, 3650),
                   np.random.normal(48000, 70000, 3650)],
                  index=[1992, 1993, 1994, 1995])

plt.style.use('ggplot')
fig, ax = plt.subplots()

cmap = mpl.colors.LinearSegmentedColormap.from_list('blue_to_red', ['darkblue', 'darkred'])

df_mean = [df.iloc[index].mean() for index in range(0, len(df.index))]
colors = [color for color in cmap(np.linspace(0, 1, len(df.index)))]
colors = [colors for _ in zip(df_mean, colors)]

ax.bar(
    df.index.tolist(),  # X-Axis, would be 1992 to 1995
    [df.iloc[index].mean() for index in range(0, len(df.index))],  # List of mean values from 92-95
    yerr=[(df.iloc[i].std() / math.sqrt(len(df.iloc[i]))) for i in range(len(df))],  # Standard deviation, 92-95
    color=cmap(colors)
)
fig.colorbar(cmap)

ax.set_title('Voting Results 1992 - 1995', fontsize=12)
plt.xticks(df.index, ('1992', '1993', '1994', '1995'))
ax.set_xlabel('Years')
ax.set_ylabel('Mean')

plt.show()