【问题标题】:Setting a colour scale in ipython在 ipython 中设置色阶
【发布时间】:2009-09-21 04:52:18
【问题描述】:

我是 python 新手,无法找到要使用的正确语法。 我想将一些超新星数据绘制到锤子投影上。数据具有坐标 alpha 和 beta。对于每个数据点,还有一个值 delta 描述了 SN 的属性。 我想创建一个范围从最小的色标。 delta 到最大值的值。 delta 的值,从红色变为紫色。 这意味着当我开始绘制数据时,我可以简单地编写:

subplot(111,projection="hammer")

p=plot(α,β,'o',mfc='delta')

其中 delta 表示光谱中介于红色和紫色之间的颜色。即如果 delta = 0,则标记将为红色,如果 delta = delta max。标记为紫色,如果 delta =(delta.max)/2 则标记为黄色。

谁能帮我解决这个问题的语法?

非常感谢

安吉拉

【问题讨论】:

    标签: python


    【解决方案1】:

    如果您正在考虑使用固定颜色表,只需将增量值映射到该表的索引范围即可。例如,您可以使用绘图包识别的颜色名称构建颜色表:

    >>> 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's Python Library。它包含color maps,包括Rainbow (red to violet, 790-380 nm)。 您还需要他的wavelen2rgb.py(根据可见光的波长计算 RGB 值)。请注意,此库将颜色生成为 RGB 三元组 - 您必须弄清楚绘图库如何期望这些颜色值。

    【讨论】:

    • 谢谢,这很有帮助。我想用很多颜色,你知道是否有一个内置的颜色渐变,这样我就可以输入我想要的所有颜色,而不是写出所有颜色:colors=[e.g.彩虹],其中彩虹将是一系列相同分级的颜色(我想要大约 100 种)。
    • 查看添加的指向可以生成颜色表的 python 库的链接。
    • 谢谢,我使用了下面的链接:on-the-matrix.com/webtools/HtmlColorCodes.aspx 将等间距的 hsl 值转换为十六进制值,然后将它们放在一个名为 color 的大数组中,如上所述。我也会看看你发布的链接。
    【解决方案2】:

    我不熟悉绘图,但生成彩虹色的一个好方法是使用 HSV(色调、饱和度、值)色彩空间。将饱和度和值设置为最大值,并改变色调。

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

    这将为您提供彩虹色的 RGB 三元组。 (1.1) 在 delta.max 处以紫色结束,而不是一直回到红色。 因此,您无需从列表中选择,而是调用该函数。

    如果返回的颜色太亮,您也可以尝试使用饱和度和值(上面函数中的 1)。

    【讨论】:

      【解决方案3】:

      使用 Johnny Lin 的 Python 库的 wavelen2rgb 函数(如 gimel 建议的那样),以下代码将 SN 绘制为实心圆圈。该代码使用 Python 始终可用的 Tkinter。你可以得到wavelen2rgb.pyhere

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

      这是输出:

      alt text http://img38.imageshack.us/img38/3449/83921879.jpg

      【讨论】:

        猜你喜欢
        • 2016-10-03
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        相关资源
        最近更新 更多