Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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 条形图颜色取决于Matplotlib中的值_Python_Matplotlib - Fatal编程技术网

Python 条形图颜色取决于Matplotlib中的值

Python 条形图颜色取决于Matplotlib中的值,python,matplotlib,Python,Matplotlib,我创建了一个条形图,如下所示: from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas import matplotlib.pyplot as plt #self.Data1 is an array containing all the data points, inherited from a separate class DataSet = range(46) self.Figure

我创建了一个条形图,如下所示:

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

#self.Data1 is an array containing all the data points, inherited from a separate class

DataSet = range(46)
self.Figure1 = plt.figure()
self.Figure1.patch.set_alpha(0)
self.Canvas1 = FigureCanvas(self.Figure1)

#Add canvas to pre-existing Widget#
self.Widget.addWidget(self.Canvas1)
self.Ax1 = plt.subplot(1, 1, 1, axisbg='black')
self.Ax1.bar(DataSet, self.Data1, width=1, color='r')
self.Ax1.tick_params(axis='y', colors='white')
plt.title('GRAPH TITLE', color='w', fontsize=30, fontname='Sans Serif', fontweight='bold')
self.Figure1.tight_layout()
这很好地工作,生成了以下图表:


我想做的是根据值设置条颜色。即,如果值为正值,则为蓝色;如果值为负值,则为红色。最简单的方法是什么?是否需要创建颜色映射?

就可重用性和/或可伸缩性而言,这并不是最好的解决方案,但如果您只想让红色条表示负数,蓝色条表示正数,则可以通过事先过滤值来调用条形图两次。以下是我的意思的一个最小示例:

import numpy as np
import matplotlib.pylab as pl

array = np.random.randn(100)
greater_than_zero = array > 0
lesser_than_zero = array < 0
cax = pl.subplot(111)
cax.bar(np.arange(len(array))[greater_than_zero], array[greater_than_zero], color='b')
cax.bar(np.arange(len(array))[lesser_than_zero], array[lesser_than_zero], color='r')

就可重用性和/或可伸缩性而言,这并不是最好的解决方案,但如果您只想让红色条表示负数,蓝色条表示正数,则可以通过事先筛选值来调用条形图两次。以下是我的意思的一个最小示例:

import numpy as np
import matplotlib.pylab as pl

array = np.random.randn(100)
greater_than_zero = array > 0
lesser_than_zero = array < 0
cax = pl.subplot(111)
cax.bar(np.arange(len(array))[greater_than_zero], array[greater_than_zero], color='b')
cax.bar(np.arange(len(array))[lesser_than_zero], array[lesser_than_zero], color='r')

您还可以将arraylike指定为颜色kwarg,如下所示:

x = np.arange(1,100)
y = np.sin(np.arange(1,100))
colors = np.array([(1,0,0)]*len(y))
colors[y >= 0] = (0,0,1)
plt.bar(x,y,color = colors)
只要颜色与y的长度相同,就可以根据需要指定颜色

或者是为了一些有点古怪的东西:

x = np.arange(1,100)
y = np.sin(3*np.arange(1,100))
colors = np.array([(1,0,0)]*len(y))
colors[y >= 0] = (0,0,1)
mult = np.reshape(np.repeat(np.abs(y)/np.max(np.abs(y)),3),(len(y),3))
colors =  mult*colors
plt.bar(x,y,color = colors)

您还可以将arraylike指定为颜色kwarg,如下所示:

x = np.arange(1,100)
y = np.sin(np.arange(1,100))
colors = np.array([(1,0,0)]*len(y))
colors[y >= 0] = (0,0,1)
plt.bar(x,y,color = colors)
只要颜色与y的长度相同,就可以根据需要指定颜色

或者是为了一些有点古怪的东西:

x = np.arange(1,100)
y = np.sin(3*np.arange(1,100))
colors = np.array([(1,0,0)]*len(y))
colors[y >= 0] = (0,0,1)
mult = np.reshape(np.repeat(np.abs(y)/np.max(np.abs(y)),3),(len(y),3))
colors =  mult*colors
plt.bar(x,y,color = colors)

谢谢你的盛宴。我的应用程序已经调用了多个其他绘图,因此理想情况下我希望实现单个绘图,但如果我无法实现,这是一个很好的选择。不确定“单个绘图”是什么意思。我编辑了我的答案,以显示您可以在同一子地块cax上绘图。这就是你的意思吗?对不起,我有点糊涂了。你的编辑让它更清晰,谢谢你。我现在就去试试。谢谢你的盛宴。我的应用程序已经调用了多个其他绘图,因此理想情况下我希望实现单个绘图,但如果我无法实现,这是一个很好的选择。不确定“单个绘图”是什么意思。我编辑了我的答案,以显示您可以在同一子地块cax上绘图。这就是你的意思吗?对不起,我有点糊涂了。你的编辑让它更清晰,谢谢你。我现在就去试试。比我建议的解决方案还要好!这个np.数组[1,0,0]*leny真是太棒了!非常好的星期五95!谢谢你的贡献!甚至比我建议的解决方案更好!这个np.数组[1,0,0]*leny真是太棒了!非常好的星期五95!谢谢你的贡献!