如何在条形图上应用自定义渐变色图?

如何解决如何在条形图上应用自定义渐变色图?

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

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

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

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

代码

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,np.random.normal(43500,140000,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()

先谢谢你!

解决方法

首先,将年份作为索引并将所有值放入列中的数据框非常不寻常。 (但 Pandas 可以使用这种格式,虽然速度有点慢。)

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

年份被转换为字符串,所以 matplotlib 将制作一个分类 x 轴。

以下是一些示例代码,可帮助您入门:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.cm import ScalarMappable

np.random.seed(12345)
df = pd.DataFrame([np.random.normal(32000,200000,3650),np.random.normal(43000,100000,np.random.normal(43500,140000,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.mean(axis=1)
norm = plt.Normalize(df_mean.min(),df_mean.max())
colors = cmap(norm(df_mean))

ax.bar(df.index.astype(str),df_mean,yerr=df.std(axis=1) / np.sqrt(len(df.columns)),color=colors)
fig.colorbar(ScalarMappable(cmap=cmap,norm=norm))

ax.set_title('Voting Results 1992 - 1995',fontsize=12)
ax.set_xlabel('Years')
ax.set_ylabel('Mean')
plt.tight_layout()
plt.show()

example bar plot with colors from gradient

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

df = pd.DataFrame(np.array([np.random.normal(32000,3650)]).T,columns=[1992,1995])
df_mean = df.mean()
ax.bar(df.columns.astype(str),yerr=df.std() / np.sqrt(len(df)),color=colors)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?