我是python的新手,无法找到正确的语法。 我想将一些超新星数据绘制到锤子投影上。数据具有坐标alpha和beta。对于每个数据点,还存在描述SN的属性的值delta。 我想创建一个范围从min的色标。 delta到max的值delta的值从红色变为紫色。 这意味着当我绘制数据时,我可以简单地写一下:
副区(111,投影= “锤”)
P =情节(α,β, 'O',MFC = '增量')
其中delta表示红色和紫色之间光谱中某处的颜色。即,如果delta = 0,则标记将是红色并且如果delta = delta max。标记为紫色,如果delta =(delta.max)/ 2,则标记为黄色。
任何人都可以帮我解决这个问题吗?
非常感谢
安吉拉
答案 0 :(得分:2)
如果您正在考虑固定颜色表,只需将delta值映射到该表的索引范围。例如,您可以构建一个颜色表,其颜色名称由您的绘图包识别:
>>> colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
您的示例中可能的delta
值范围为0
到delta.max
。将其映射到颜色表的长度,得到step
:
>>> step = delta.max / len(colors)
获得与给定data
点匹配的颜色名称所需的计算是:
>>> color = colors[math.trunc(data / step)]
此方法适用于任何一组预先选定的颜色,例如RGB值表示为十六进制数。
快速谷歌搜索发现Johnny Lin's Python Library。它包含color maps,包括Rainbow (red to violet, 790-380 nm)
。
您还需要他的wavelen2rgb.py
(根据可见光的波长计算RGB值)。请注意,此库生成RGB三元组的颜色 - 您必须计算绘图库如何期望这些颜色值。
答案 1 :(得分:1)
我不熟悉绘图,但生成彩虹色的好方法是使用HSV(色调,饱和度,值)颜色空间。将饱和度和值设置为最大值,并改变色调。
import colorsys
def color(value):
return colorsys.hsv_to_rgb(value / delta.max / (1.1), 1, 1)
这将为您提供彩虹色RGB三联体。 (1.1)在delta.max处以紫色结束,而不是一直回到红色。 因此,您可以调用该函数,而不是从列表中进行选择。
如果返回的颜色太亮,您也可以尝试使用饱和度和值(上面函数中的1)进行试验。
答案 2 :(得分:1)
使用Johnny Lin的Python库的wavelen2rgb函数(如gimel建议的那样),下面的代码将SN绘制为实心圆。代码使用Tkinter,它始终可用于Python。你可以获得wavelen2rgb.py here。
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()
这是outpout: