mathematica 分段函数使用不同的颜色

环境: mathematica 12.0, fedora 29 workstation x86_64
smooth L1:
f ( x ) = { 0.5 x 2 ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise f(x)= \begin{cases} 0.5x^2 & \mid x\mid<1\\ \mid x\mid-0.5 & \text{otherwise} \end{cases} f(x)={0.5x2x0.5x<1otherwise

code snipet 1:

f = Piecewise[{{0.5 #^2, Abs[#] < 1}, {Abs[#] - 0.5,  Abs[#] >= 1}, {Log[#], 2 < #}}] &;

colorFunction = f;
piecewiseParts = Length@colorFunction[[1, 1]];
colors = ColorData[1][#] & /@ Range@piecewiseParts;
colorFunction[[1, 1, All, 1]] = colors;

Plot[f[x], {x, -2, 2}, ColorFunction -> colorFunction, ColorFunctionScaling -> False]

code snipet 2:

pwSplit[_[pairs : {{_, _} ..}]] := 
 Piecewise[{#}, Indeterminate] & /@ pairs

pwSplit[_[pairs : {{_, _} ..}, expr_]] := 
 Append[pwSplit@{pairs}, pwSplit@{{{expr, Nor @@ pairs[[All, 2]]}}}]

pw = Piecewise[{{0.5 x^2, Abs[x] < 1}, {Abs[x] - 0.5, Abs[x] >= 1}}];

Plot[Evaluate[pwSplit@pw], {x, -2, 2}, PlotStyle -> Thick,  Axes -> True]

smoothL1

[1] https://mathematica.stackexchange.com/questions/1128/plotting-piecewise-function-with-distinct-colors-in-each-section

(*初始化存储结构*) processedResults0 = Table[{}, {i, Length[results110]}, {j, Length[results110[[i]]]}]; data = {}; Do[(*获取当前k3,\[CurlyPhi]及解*) {currentK3, currentPhi, solutions} = results110[[i, j]]; (*检查是否有解*) If[Length[solutions] > 0, Do[ \[Gamma]cVal = Subscript[\[Gamma], c] /. solutions[[m]]; wBVal = Subscript[w, B] /. solutions[[m]]; wcVal = Subscript[w, c] /. solutions[[m]]; \[Gamma]BVal = Subscript[\[Gamma], B] /. solutions[[m]]; \[Omega]EP5Val = Subscript[\[Omega], EP5] /. solutions[[m]]; AppendTo[ data, {currentK3, currentPhi, \[Gamma]cVal, wBVal, wcVal, \[Gamma]BVal, \[Omega]EP5Val}]; H1 = First[H /. gsSol /. {\[Epsilon]2 -> 0, \[Epsilon]1 -> 0, \[Epsilon]3 -> 0, Subscript[k, 3] -> currentK3, \[Phi] -> currentPhi, \[Omega] -> Subscript[\[Omega], EP5]} /. solutions[[m]]]; vectors = Eigenvectors[H1] // FullSimplify; leftVecs = Eigenvectors[Transpose[H1]] // FullSimplify; PF = Table[ psiR = Normalize[vectors[[n]]];(*右特征向量归一化*) psiL = Normalize[leftVecs[[n]]];(*左特征向量归一化*) 1/Abs[psiL . psiR]^2,(*彼得曼因子*){n, 1, 3}]; (*将PF存到对应位置*) processedResults0[[i, j]] = Append[processedResults0[[i, j]], Total[PF]]; , {m, Length[solutions]}] ], {i, Length[results110]}, {j, Length[results110[[i]]]} ]; processedResults0; (*批量生成四个矩阵和热力图*) plots0 = Table[ count110 = Table[processedResults0[[i, j, k]], {i, Length[k3Values]}, {j, Length[\[Phi]Values]}]; MatrixPlot[count110, FrameLabel -> {"k3", "\[CurlyPhi]"}, PlotLabel -> Row[{"第 ", k, "组解对应的PF值 "}], ColorFunction -> colorFunc,(*统一颜色函数*) ColorFunctionScaling -> False,(*关闭自动缩放*) PlotLegends -> BarLegend[{colorFunc, {0, 5000}}] (*统一图例*) ], {k, 4} ]; (*合并为2x2排列*) GraphicsGrid[Partition[plots0, 4], ImageSize -> Full] 我想让空值的部分画成白的,其他的0-1000画成绿黄红渐变,1000以上红的
最新发布
03-08
<think>嗯,用户想在Mathematica的MatrixPlot里自定义颜色方案,具体是空值显示白色,0-1000用绿黄红渐变,超过1000的红色。我需要先回忆MatrixPlot的相关选项,尤其是ColorFunction的设置。 首先,空值部分通常可能是缺失数据,Mathematica里用None还是NaN?可能需要用ColorRules来处理空值的颜色。然后,0到1000的范围需要渐变,超过1000固定红色。ColorFunction可能得用自定义函数,结合If或者Piecewise来分情况处理。 然后,ColorFunction通常接收0到1的标准化值,但用户的数据范围是0到1000以上,所以可能需要指定ColorFunctionScaling->False来禁用自动缩放。这样可以直接用原始值判断。 接着,定义颜色函数:如果值是空,返回白色;如果值>1000,红色;否则在0-1000之间用Blend绿黄红渐变。Blend的参数可能需要确定颜色对应的位置,比如绿在0,黄在0.5,红在1,这样Blend[{{0,Green},{0.5,Yellow},{1,Red}},x/1000]可能合适。 然后,ColorRules可能需要设置一个规则,比如_ -> White来处理空值?或者用Missing[]类型?可能需要测试。假设空值用Missing,那么ColorRules -> {Missing[_] -> White}。但用户的数据结构是否如此呢?可能需要更通用的方法,比如检查是否为None或NaN。 最后,把这些选项组合到MatrixPlot中,确保各部分正确衔接。可能需要测试分段函数是否正确处理了各个区间,特别是边界情况,比如刚好1000的时候应该属于渐变的最顶端红色,而超过1000则直接红色。同时,注意ColorFunction的优先级是否覆盖了ColorRules,需要确认文档。 可能还需要考虑数据中的最大值是否超过1000,确保超过部分正确应用红色。另外,Blend函数的参数是否正确线性插值颜色。可能需要用户调整颜色分布,比如让绿色到黄色在0到500,黄色到红色在500到1000,或者均匀分布。根据用户描述,应该是整个0-1000均匀渐变,绿到黄再到红,所以三个颜色点可能更合适。 总结步骤:定义颜色函数处理不同区间的颜色,设置ColorFunctionScaling为False,用ColorRules处理空值为白色,然后在MatrixPlot中组合这些选项。</think>在Mathematica中实现自定义颜色方案需要结合`ColorFunction`和`ColorRules`选项。以下是分步解决方案: 1. **定义颜色函数**: ```mathematica colorFunc = If[# == 0, White, (*空值处理*) If[# > 1000, Red, (*超限值*) Blend[{{0, Green}, {0.5, Yellow}, {1, Red}}, #/1000]]] &; ``` 2. **设置绘图选项**: ```mathematica MatrixPlot[data, ColorFunction -> colorFunc, ColorFunctionScaling -> False, (*禁用自动归一化*) ColorRules -> {0 -> White} (*空值对应0时适用*) ] ``` **注意事项**: - 如果空值存储为`None`或`Missing[]`,需改用`ColorRules -> {_Missing -> White}` - 使用`ColorFunctionScaling -> False`保持原始数值范围[^1] - 渐变参数`0.5`控制黄色位置,可调整为`0.3`使黄色更早出现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值