扩展颜色栏以包括超出范围的数据

时间:2020-08-02 11:52:18

标签: python matplotlib colorbar colormap

我正尝试使用以下代码制作Polar热图。

# Plotting the polar plot 
from matplotlib.colorbar import ColorbarBase
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
cmap = obspy_sequential 

# Have defined the variables to be used for pointing to the coordinates 
# baz is angular, slow is radial, abs_power is the value at every co-ordinate
# Choose number of fractions in plot (desirably 360 degree/N is an integer!)
N = 72
N2 = 30
abins = np.arange(N + 1) * 360. / N
sbins = np.linspace(0, 3, N2 + 1)

# Sum rel power in bins given by abins and sbins
hist, baz_edges, sl_edges = \
    np.histogram2d(baz, slow, bins=[abins, sbins], weights=abs_power)

# Transform to radian
baz_edges = np.radians(baz_edges)

# Add polar and colorbar axes
fig = plt.figure(figsize=(8, 8))
cax = fig.add_axes([0.85, 0.2, 0.05, 0.5])
ax = fig.add_axes([0.10, 0.1, 0.70, 0.7], polar=True)
ax.set_theta_direction(-1)
ax.set_theta_zero_location("N")

dh = abs(sl_edges[1] - sl_edges[0])
dw = abs(baz_edges[1] - baz_edges[0])

# Circle through backazimuth
for i, row in enumerate(hist):
    bars = ax.bar((i * dw) * np.ones(N2),
                  height=dh * np.ones(N2),
                  width=dw, bottom=dh * np.arange(N2),color=cmap(row / hist.max()))

ax.set_xticks(np.linspace(0, 2 * np.pi, 10, endpoint=False))
ax.set_yticklabels(velocity)
ax.set_ylim(0, 3)
[i.set_color('white') for i in ax.get_yticklabels()]
ColorbarBase(cax, cmap=cmap,
             norm=LogNorm(vmin=hist.min(),vmax=hist.max()))
plt.show()

我正在创建多个这样的图,因此我需要将颜色条的范围扩展到超出abs_power数据范围的最大值。 我尝试将vmax和vmin更改为所需的最大-最小目标数字,但它每次都绘制出完全相同的图。彩条上的最大值不断变化,但曲线图不变。为什么会这样呢? 这是它的样子,


Polar colormap


此处的实际最大功率比色条中指定的最大功率小得多。仍然可以看到亮黄色的斑点。 PS:对于我提供的任何vmax,vmin值,我都会得到相同的图。

1 个答案:

答案 0 :(得分:1)

更改颜色条对主图没有影响。您需要更改[0, 1]中使用的公式以更改Barplot。 “规范”仅用于此任务。规范将数字范围映射到间隔hist.max()。映射到大于1的值(即示例中大于my_norm = LogNorm(vmin=hist.min(),vmax=hist.max()) for i, row in enumerate(hist): bars = ax.bar((i * dw) * np.ones(N2), height=dh * np.ones(N2), width=dw, bottom=dh * np.arange(N2),color=cmap(my_norm(row))) 的值)的每个值都被分配了最高的颜色。

要使颜色条反映正确的信息,您需要对图和颜色条使用相同的cmap和相同的范数:

ColorbarBase(cax, cmap=cmap, norm=my_norm)

my_norm = LogNorm(vmin=hist.min(), vmax=hist.max()*100)

另一方面,如果您不想显示黄色,则可以尝试使用上面代码中的ColorbarBase之类的东西。

与其通过plt.colorbar()创建颜色条,不如使用标准的ScalarMappable,但可以使用LogNorm来指示颜色图和使用的规范,这会有所帮助。如果是from matplotlib.cm import ScalarMappable plt.colorbar(ScalarMappable(cmap=cmap, norm=my_norm), ax=ax, cax=cax) ,它将以对数格式显示刻度。

import java.io.*;
import java.util.*; 

public class Main {
    public static void main(String[] args) throws IOException {
        
        System.out.println("Enter how many numbers you want to enter : ");
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int k = Integer.parseInt(str);
        int arr[] = new int[k];
        
        System.out.println("Enter the numbers : ");
        for(int i=0;i<k;i++) {
            BufferedReader br1= new BufferedReader(new InputStreamReader(System.in));
            str=br1.readLine();
            arr[i] = Integer.parseInt(str);
        }
        
        findMax(arr);
    }
        
    private static void findMax(int[] arr) {
        int sum=0,i,count=0,max,min,n;
        int len = arr.length;            
        float avg;
        
        max = arr[0];
        min = arr[0];
        while(count < len) {
            sum += arr[count];
            if(min > arr[count])
                min = arr[count];
            if (max < arr[count])
                max = arr[count];
            count += 1;
        }
        
        avg = sum/len;
        
        System.out.println("\nPrinting the results : \n");
        System.out.println("Sum     = " +sum);
        System.out.println("Average = " +avg);
        System.out.println("Maximum = " +max);
        System.out.println("Minimum = " +min);
    }
}