Matplotlib双色分布图绘制

2024-10-03 19:29:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这里的目标是将超过某个阈值的值变成一种颜色,并将低于该阈值的值转换为另一种颜色。下面的代码试图将它分成两个直方图,但只有当阈值为50%时,它才显得平衡。我假设我必须使用discreetlevel变量。在

finalutilityrange是一个包含一堆值的向量(您必须生成它来测试代码),我正试图将其绘制出来。值deter是决定它们是蓝色还是红色的值。discreetlevel正是我想要的箱子数量。在

import random
import numpy as np
import matplotlib.pyplot as plt

discreetlevel = 10
deter = 2

for x in range(0,len(finalutilityrange)):
    if finalutilityrange[x-1]>=deter:
        piraterange.append(finalutilityrange[x-1])
    else:
        nonpiraterange.append(finalutilityrange[x-1])

plt.hist(piraterange,bins=discreetlevel,normed=False,cumulative=False,color = 'b')
plt.hist(nonpiraterange,bins=discreetlevel),normed=False,cumulative=False,color = 'r')
plt.title("Histogram")
plt.xlabel("Utlity")
plt.ylabel("Probability")
plt.show()

Tags: importfalse颜色asplt阈值histappend
2条回答

这个答案并没有针对您的代码,因为它不是自包含的,但是对于您要做的事情,默认的直方图应该可以工作(假设加载了numpy/pyplot)

x = randn(100)
idx = x < 0.2 # Threshold to separate values
hist([x[idx], x[~idx]], color=['b', 'r'])

说明:

  1. 第一行只是生成一些随机数据来测试
  2. 为数据低于某个阈值的位置创建一个索引,可以用~对其求反,以找到超出阈值的位置
  3. 最后一行绘制柱状图。这个命令需要一个单独组的列表来绘制,这在这里没有什么大的区别,但是如果normed=True它会的

hist图可以做的更多,所以在您自己意外地实现它之前,请仔细查看文档。在

这个解决方案比@user2699的要复杂一点。我只是为了完整性而展示它。您可以完全控制hist返回的面片对象,因此,如果您可以确保所使用的阈值正好位于bin边上,则很容易更改为选定面片的颜色。之所以可以这样做,是因为hist可以接受一系列bin边作为bins参数。在

import numpy as np
from matplotlib import pyplot as plt 

# Make sample data
finalutilityrange = np.random.randn(100)
discreetlevel = 10
deter = 0.2

# Manually create `discreetlevel` bins anchored to  `deter`
binsAbove = round(discreetlevel * np.count_nonzero(finalutilityrange > deter) / finalutilityrange.size)
binsBelow = discreetlevel - binsAbove
binwidth = max((finalutilityrange.max() - deter) / binsAbove,
               (deter - finalutilityrange.min()) / binsBelow)
bins = np.concatenate([
           np.arange(deter - binsBelow * binwidth, deter, binwidth),
           np.arange(deter, deter + (binsAbove + 0.5) * binwidth, binwidth)
])

# Use the bins to make a single histogram
h, bins, patches = plt.hist(finalutilityrange, bins, color='b')

# Change the appropriate patches to red
plt.setp([p for p, b in zip(patches, bins) if b >= deter], color='r')

结果是一个同质直方图,包含不同颜色的箱子:

enter image description here

箱子可能会比你没有锚定到deter稍微宽一点。第一个或最后一个bin通常会稍微超过数据的边缘。在

相关问题 更多 >