为Polar Scatter绘图数据点添加颜色

时间:2017-03-30 05:38:49

标签: python numpy matplotlib plot scatter

我试图用Python创建一个极地情节,到目前为止我已经取得了一些成功

极地散点图示例

我确实有几个问题,我希望得到一些想法/建议:

  1. 是否可以将圆圈的颜色设置为特定值(例如:" n"在下面的示例代码中)?如果是这样,我可以设置特定的颜色范围吗?例如:0-30:红色,31-40:黄色; 41-60:绿色
  2. 注意:按照Plot with conditional colors based on values in R中的示例,我尝试ax.scatter(ra,dec,c = ifelse(n < 30,’red','green'), pch = 19 )但没有成功=(

    1. 如何让数据圈变得更大?

    2. 我可以移动&#34; 90&#34;标签,以便图表标题不重叠?我试过了: x.set_rlabel_position(-22.5)但我收到了错误(&#34;属性错误:&#39; PolarAxes&#39;对象没有属性&#39; set_rlabel_position&#39;&#34;)

    3. 是否可以仅显示0,30和60个高程标签?这些可以水平定向(例如:沿着0方位线)吗?

    4. 非常感谢你!期待听到您的建议=)

      import numpy
      import matplotlib.pyplot as pyplot
      
      dec = [10,20,30,40,50,60,70,80,90,80,70,60,50,40,30,20,10]
      ra = [225,225,225,225,225,225,225,225,225,45,45,45,45,45,45,45,45]
      n = [20,23,36,43,47,48,49,50,51,50,48,46,44,36,30,24,21]
      
      ra = [x/180.0*3.141593 for x in ra]
      fig = pyplot.figure()
      ax = fig.add_axes([0.1,0.1,0.8,0.8],polar=True)
      ax.set_ylim(0,90)
      ax.set_yticks(numpy.arange(0,90,10))
      ax.scatter(ra,dec,c ='r')
      ax.set_title("Graph Title here", va='bottom')
      pyplot.show()
      

2 个答案:

答案 0 :(得分:2)

<强> 1。着色点
使用c scatter参数可以对点进行着色。您可以在其中提供n数组,并根据色彩图选择颜色。色彩图由不同的颜色组成(红色31倍,黄色10倍,绿色20倍)。 使用色彩映射的优点是它可以轻松使用色条。

<强> 2。使用s参数可以完成更大的。

第3。在标签和标题之间添加空格最好使用y参数set_title将标题向上移动一点。为了使标题不超出图中,我们可以使用subplots_adjust方法并使top稍微小一些。 (请注意,仅当通过子图创建轴时才有效。)

<强> 4。只显示某些刻度可以通过设置来完成 标记为ax.set_yticks([0,30,60])并沿着水平线定向ylabels由ax.set_rlabel_position(0)完成。 (请注意,版本1.4中可以使用set_rlabel_position,如果您有早期版本,请考虑更新)。

enter image description here

import numpy as np
import matplotlib.pyplot as plt # don't use pylab
import matplotlib.colors
import matplotlib.cm

dec = [10,20,30,40,50,60,70,80,90,80,70,60,50,40,30,20,10]
ra = [225,225,225,225,225,225,225,225,225,45,45,45,45,45,45,45,45]
n = [20,23,36,43,47,48,49,50,51,50,48,46,44,36,30,24,21]

ra = [x/180.0*np.pi for x in ra]
fig = plt.figure()
ax = fig.add_subplot(111,polar=True)
ax.set_ylim(0,90)

# 4. only show 0,30, 60 ticks
ax.set_yticks([0,30,60])
# 4. orient ylabels along horizontal line
ax.set_rlabel_position(0)

# 1. prepare cmap and norm
colors= ["red"] * 31 + ["gold"] * 10 + ["limegreen"] * 20
cmap=matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.Normalize(vmin=0, vmax=60)   
# 2. make circles bigger, using `s` argument
# 1. set different colors according to `n`
sc = ax.scatter(ra,dec,c =n, s=49, cmap=cmap, norm=norm, zorder=2)

# 1. make colorbar
cax = fig.add_axes([0.8,0.1,0.01,0.2])
fig.colorbar(sc, cax=cax, label="n", ticks=[0,30,40,60])
# 3. move title upwards, then adjust top spacing
ax.set_title("Graph Title here", va='bottom', y=1.1)
plt.subplots_adjust(top=0.8)

plt.show()

答案 1 :(得分:1)

对于颜色,您可以使用c = [每个元素的颜色列表],尺寸s = 像这里:

ax.scatter(ra,dec,c =['r' if a < 31 else 'yellow' if a < 41 else 'green' for a in n], s =40)

对于标题和轴我建议更改标题的位置:

ax.set_title("Graph Title here", va='bottom', y=1.08)

您可能需要调整图形的大小才能正确显示标题:

fig = pyplot.figure(figsize=(7,8))

了解您可以使用的刻度线:

for label in ax.yaxis.get_ticklabels():
    label.set_visible(False)
for label in ax.yaxis.get_ticklabels()[::3]:
    label.set_visible(True)

整体:

import numpy
import matplotlib.pyplot as pyplot

dec = [10,20,30,40,50,60,70,80,90,80,70,60,50,40,30,20,10]
ra = [225,225,225,225,225,225,225,225,225,45,45,45,45,45,45,45,45]
n = [20,23,36,43,47,48,49,50,51,50,48,46,44,36,30,24,21]

ra = [x/180.0*3.141593 for x in ra]
fig = pyplot.figure(figsize=(7,8))
ax = fig.add_axes([0.1,0.1,0.8,0.8],polar=True)
ax.set_ylim(0,90)
ax.set_yticks(numpy.arange(0,90,10))

ax.scatter(ra,dec,c =['r' if a < 31 else 'yellow' if a < 41 else 'green' for a in n], s =40)
ax.set_title("Graph Title here", va='bottom', y=1.08)
for label in ax.yaxis.get_ticklabels():
    label.set_visible(False)
for label in ax.yaxis.get_ticklabels()[::3]:
    label.set_visible(True)
pyplot.show()