在ipython中设置颜色范围

2 投票
3 回答
2341 浏览
提问于 2025-04-15 14:27

我刚开始学Python,遇到了一些麻烦,不知道该用什么样的语法。
我想把一些超新星的数据绘制到一个锤形投影图上。这些数据有两个坐标,分别叫做alpha和beta。每个数据点还有一个值叫做delta,用来描述超新星的某个特性。
我想创建一个颜色范围,从delta的最小值到最大值,颜色从红色到紫色。
这样的话,当我绘制数据时,我可以简单地写:

subplot(111,projection="hammer")

p=plot([alpha],[beta],'o',mfc='delta')

在这里,delta就代表了红色到紫色之间的某种颜色。也就是说,如果delta=0,标记就是红色;如果delta等于最大值,标记就是紫色;如果delta是最大值的一半,标记就是黄色。

有没有人能帮我解决这个语法问题?

非常感谢

安吉拉

3 个回答

1

我对绘图不太熟悉,但有一种很好的方法可以生成彩虹颜色,那就是使用HSV颜色空间(色相、饱和度、明度)。你只需要把饱和度和明度设置到最大,然后改变色相的值。

import colorsys

def color(value):
    return colorsys.hsv_to_rgb(value / delta.max / (1.1), 1, 1)

这样你就能得到彩虹颜色的RGB三元组。这里的(1.1)是为了让颜色在紫色结束,而不是回到红色。

所以,你不需要从一个列表中选择颜色,而是直接调用这个函数。

如果你觉得返回的颜色太亮了,也可以尝试调整饱和度和明度(上面函数中的1),看看效果如何。

1

使用Johnny Lin的Python库中的wavelen2rgb函数(正如gimel所建议的),下面的代码可以将SN(超新星)绘制成填充的圆圈。这个代码使用了Tkinter,而Tkinter在Python中是随时可以使用的。你可以在这里下载wavelen2rgb.py文件。

def sn():
    "Plot a diagram of supernovae, assuming wavelengths between 380 and 645nm."
    from Tkinter import *
    from random import Random
    root = Tk()                 # initialize gui
    dc = Canvas(root)           # Create a canvas
    dc.grid()                   # Show canvas
    r = Random()                # intitialize random number generator
    for i in xrange(100):       # plot 100 random SNs
        a = r.randint(10, 400)
        b = r.randint(10, 200)
        wav = r.uniform(380.0, 645.0)
        rgb = wavelen2rgb(wav, MaxIntensity=255)  # Calculate color as RGB
        col = "#%02x%02x%02x" % tuple(rgb)        # Calculate color in the fornat that Tkinter expects
        dc.create_oval(a-5, b-5, a+5, b+5, outline=col, fill=col) # Plot a filled circle
    root.mainloop()
sn()

这是输出结果:

图片链接 http://img38.imageshack.us/img38/3449/83921879.jpg

2

如果你在考虑使用固定的颜色表,那就可以把你的变化值(delta值)映射到这个颜色表的索引范围内。比如,你可以创建一个包含你绘图工具可以识别的颜色名称的颜色表:

>>> colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']

在你的例子中,可能的delta值范围是从0delta.max。把这个范围映射到颜色表的长度,就可以得到step

>>> step = delta.max / len(colors)

然后,要找出与某个给定data点匹配的颜色名称,需要进行的计算是:

>>> color = colors[math.trunc(data / step)]

这种方法适用于任何预先选择的颜色集,比如以十六进制数字表示的RGB值。

我快速搜索了一下,发现了Johnny Lin的Python库。里面包含了颜色映射,包括彩虹色(从红到紫,790-380 nm)

你还需要他的wavelen2rgb.py(根据可见光的波长计算RGB值)。请注意,这个库生成的颜色是RGB三元组格式的——你需要弄清楚你的绘图库是如何期望这些颜色值的。

撰写回答