Matplotlib用两种颜色绘制分布图

h7wcgrx3  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(179)

这里的目标是将高于某个阈值的值着色为一种颜色,低于该阈值的值着色为另一种颜色。下面的代码试图将其分成两个直方图,但只有当阈值为50%时,它才看起来平衡。我假设我必须使用discreetlevel变量。
finalutilityrange是一个向量,它包含一组值(您必须生成它来测试代码),我正试图绘制这个向量。值deter是决定它们是蓝色还是红色的值。discreetlevel正是我想要的bin的数量。

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()
g0czyy6m

g0czyy6m1#

这个解决方案比@user2699的要复杂一些,我只是为了完整起见才提出它,您可以完全控制hist返回的patch对象,所以如果您可以确保使用的阈值正好位于bin边缘,可以很容易地更改所选面片的颜色。您可以这样做,因为hist可以接受一系列面元边缘作为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')

结果是具有不同颜色的柱的同质直方图:

与未锚到deter时相比,bin可能会稍宽一些。第一个或最后一个bin通常会稍微超出数据的边缘。

k0pti3hp

k0pti3hp2#

这个答案不能解决你的代码,因为它不是自包含的,但是对于你尝试做的事情,默认的直方图应该可以工作(假设numpy/pyplot被加载)

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

说明:
1.第一行只生成一些随机数据进行测试,
1.为数据低于某个阈值的位置创建索引,可以使用~求反来查找数据高于阈值的位置
1.最后一行绘制直方图。该命令需要绘制单独组的列表,这在这里没有太大区别,但如果是normed=True,它将
hist图还可以做更多的事情,所以在您自己意外实现它之前,请仔细阅读文档。

eit6fx6z

eit6fx6z3#

正如上面所做的那样:

x = np.random.randn(100)
threshold_x = 0.2 # Threshold to separate values

x_lower, x_upper = (
    [_ for _ in x if _ < threshold_x], 
    [_ for _ in x if _ >= threshold_x]
)

hist([x_lower, x_upper], color=['b', 'r'])

相关问题